"""Die vollstaendige Minimap gegen den Client absichern.

Der Tibia-Client haelt Minimap-Kacheln im Speicher und schreibt sie
spaeter auf die Platte zurueck. Kacheln, die er beim Start bereits im
Speicher hatte, ueberschreibt er dabei mit seinem eigenen, viel duenneren
Stand. Eine frisch installierte Vollkarte verliert so einzelne Bloecke,
ohne dass man es merkt.

Am 23.07.2026 ist genau das passiert: von 1094 Kacheln fielen drei der
Etage 7 von 100 % auf 1-11 % zurueck. Auf der Minimap war das ein
schwarzer Streifen, und der Bot fand sich darin nicht mehr auf der Karte
wieder - `getCoordinate` lieferte nur noch `None`, weil der
Kartenausschnitt nicht mehr zur Referenzkarte passte.

Darum liegt neben der Live-Minimap eine Vorlage mit der vollstaendigen
Karte, die vor jedem Client-Start darueber kopiert wird. Das kann nichts
kaputt machen: die Vorlage ist vollstaendig, und eine vom Client
geschriebene Fassung derselben Kachel kann nie mehr enthalten als das.

Die Marker-Datei bleibt ausgenommen - das sind eigene Notizen auf der
Karte, die niemand ueberschrieben haben will.
"""

from pathlib import Path
import os
import shutil


MARKER_DATEI = 'minimapmarkers.bin'


def _lokalerOrdner() -> Path:
    return Path(os.environ.get(
        'LOCALAPPDATA', str(Path.home() / 'AppData' / 'Local')))


def minimapOrdner() -> Path:
    """Wo der Client seine Minimap fuehrt."""
    return _lokalerOrdner() / 'Tibia' / 'packages' / 'Tibia' / 'minimap'


def vorlageOrdner() -> Path:
    """Wo die unversehrte Vollkarte liegt.

    Bewusst ausserhalb des Projektordners: 6,6 MB Kacheln gehoeren nicht
    in die Versionsverwaltung.
    """
    return _lokalerOrdner() / 'TibiaPilotNG' / 'minimap-vorlage'


def _kacheln(ordner: Path):
    if not ordner.is_dir():
        return []
    return [
        pfad for pfad in sorted(ordner.iterdir())
        if pfad.is_file() and pfad.name != MARKER_DATEI
    ]


def erstelleVorlage(quelle: Path = None, ziel: Path = None) -> int:
    """Den jetzigen Stand als Vorlage sichern.

    Absichtlich nichts, was von selbst passiert: eine bereits
    beschaedigte Karte darf nicht zur Vorlage werden. Aufrufen, nachdem
    der Karten-Installer bei geschlossenem Client durchgelaufen ist.
    """
    quelle = quelle or minimapOrdner()
    ziel = ziel or vorlageOrdner()
    dateien = _kacheln(quelle)
    if not dateien:
        raise FileNotFoundError(f'Keine Minimap-Kacheln unter {quelle}')
    if ziel.exists():
        shutil.rmtree(ziel)
    ziel.mkdir(parents=True)
    for pfad in dateien:
        shutil.copy2(pfad, ziel / pfad.name)
    return len(dateien)


def stelleVorlageHer(vorlage: Path = None, ziel: Path = None) -> int:
    """Die Vorlage ueber die Live-Minimap legen; gibt die Zahl der
    ersetzten Kacheln zurueck.

    Nur ersetzen, nie loeschen: Kacheln, die es allein im Live-Ordner
    gibt, bleiben unangetastet.

    ponytail: Vergleicht ganze Dateien statt nur Groesse/Datum. Bei 6,6
    MB ist das im Millisekundenbereich; feiner wird es erst noetig, wenn
    die Vorlage einmal *nicht* vollstaendig sein sollte.
    """
    vorlage = vorlage or vorlageOrdner()
    ziel = ziel or minimapOrdner()
    dateien = _kacheln(vorlage)
    if not dateien:
        return 0
    ziel.mkdir(parents=True, exist_ok=True)
    ersetzt = 0
    for pfad in dateien:
        vorhanden = ziel / pfad.name
        if vorhanden.is_file() and vorhanden.read_bytes() == pfad.read_bytes():
            continue
        shutil.copy2(pfad, vorhanden)
        ersetzt += 1
    return ersetzt
