"""On-Demand-Icon-Beschaffung fuer Loot-Items (TibiaWiki, 32x32, Grau).

Der Router braucht pro Item ein Icon unter images/items/<id>.png.
Bekannte Items liegen im Repo; unbekannte werden einmalig von
tibia.fandom.com geladen (Name aus der BBot-Items-DB) und lokal
abgelegt — danach ist kein Netzwerk mehr noetig.
"""
import urllib.request

import cv2
import numpy as np

from src.wiki.items import itemName

from .slotIcons import SLOT_ITEMS, _itemsPath

_USER_AGENT = 'TibiaPilotNG/1.0 (item icon fetch)'


def ensureItemIcon(itemId, fetch=True):
    """Stellt sicher, dass <id>.png existiert; Pfad oder None."""
    path = _itemsPath / f'{itemId}.png'
    if path.exists():
        return path
    if not fetch:
        return None
    name = itemName(itemId)
    if name is None:
        return None
    url = (
        'https://tibia.fandom.com/wiki/Special:FilePath/'
        + name.replace(' ', '_') + '.gif'
    )
    try:
        request = urllib.request.Request(
            url, headers={'User-Agent': _USER_AGENT})
        with urllib.request.urlopen(request, timeout=10) as response:
            data = response.read()
        image = cv2.imdecode(
            np.frombuffer(data, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
        if image is None:
            return None
        if image.shape[2] == 4:
            image = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        if gray.shape[0] != 32 or gray.shape[1] != 32:
            gray = cv2.resize(gray, (32, 32), interpolation=cv2.INTER_AREA)
        cv2.imwrite(str(path), gray)
    except Exception:
        return None
    SLOT_ITEMS.setdefault(itemId, name)
    return path
