"""Feld-Erkennung auf dem Spielfenster (Feuer-/Energie-/Giftfelder).

Die Captures sind Graustufen: Gefahrenfelder fallen als flaechendeckend
sehr helle Tiles auf (Feuer ist mit Abstand das hellste Spielelement).
Die Schwellen sind konservativ gesetzt und werden mit echten
Spiel-Screenshots nachkalibriert (TIBIAPILOT_FIELDS=0 schaltet ab).
"""
import os

import numpy as np

TILES_X, TILES_Y = 15, 11
BRIGHT_THRESHOLD = int(os.getenv('TIBIAPILOT_FIELD_BRIGHTNESS', '225'))
BRIGHT_RATIO = float(os.getenv('TIBIAPILOT_FIELD_RATIO', '0.5'))
FIELDS_ENV = 'TIBIAPILOT_FIELDS'


def fieldsEnabled():
    return os.getenv(FIELDS_ENV, '1') != '0'


def getFieldCoordinates(gameWindowImage, playerCoordinate):
    """Helle Gefahrenfelder als Radar-Koordinaten (Zentrum = Spieler)."""
    if not fieldsEnabled():
        return []
    if gameWindowImage is None or playerCoordinate is None:
        return []
    height, width = gameWindowImage.shape[:2]
    tileWidth = max(width // TILES_X, 1)
    tileHeight = max(height // TILES_Y, 1)
    centerX, centerY = TILES_X // 2, TILES_Y // 2
    fields = []
    for tileY in range(TILES_Y):
        for tileX in range(TILES_X):
            tile = gameWindowImage[
                tileY * tileHeight:(tileY + 1) * tileHeight,
                tileX * tileWidth:(tileX + 1) * tileWidth,
            ]
            if tile.size == 0:
                continue
            ratio = float((tile >= BRIGHT_THRESHOLD).mean())
            if ratio >= BRIGHT_RATIO:
                fields.append((
                    playerCoordinate[0] + tileX - centerX,
                    playerCoordinate[1] + tileY - centerY,
                    playerCoordinate[2],
                ))
    return fields
