import pytest

from src.utils import minimap


def _ordner(basis, name, dateien):
    ordner = basis / name
    ordner.mkdir()
    for dateiname, inhalt in dateien.items():
        (ordner / dateiname).write_bytes(inhalt)
    return ordner


def test_vorlage_uebernimmt_kacheln_ohne_marker(tmp_path):
    quelle = _ordner(tmp_path, 'live', {
        'Minimap_Color_32256_32000_7.png': b'vollstaendig',
        'Minimap_WaypointCost_32256_32000_7.png': b'kosten',
        minimap.MARKER_DATEI: b'eigene notizen',
    })
    ziel = tmp_path / 'vorlage'

    assert minimap.erstelleVorlage(quelle, ziel) == 2
    assert not (ziel / minimap.MARKER_DATEI).exists()
    assert (ziel / 'Minimap_Color_32256_32000_7.png').read_bytes() == b'vollstaendig'


def test_vorlage_aus_leerem_ordner_ist_ein_fehler(tmp_path):
    """Sonst haette man eine leere Vorlage und wuerde es nicht merken."""
    quelle = _ordner(tmp_path, 'live', {})

    with pytest.raises(FileNotFoundError):
        minimap.erstelleVorlage(quelle, tmp_path / 'vorlage')


def test_vorlage_wird_beim_neuschreiben_ersetzt(tmp_path):
    """Alte Kacheln duerfen nicht als Reste in der Vorlage bleiben."""
    quelle = _ordner(tmp_path, 'live', {'Minimap_Color_1_1_7.png': b'neu'})
    ziel = _ordner(tmp_path, 'vorlage', {'Minimap_Color_9_9_9.png': b'alt'})

    minimap.erstelleVorlage(quelle, ziel)

    assert [pfad.name for pfad in sorted(ziel.iterdir())] == [
        'Minimap_Color_1_1_7.png']


def test_beschaedigte_kachel_wird_ersetzt(tmp_path):
    """Der Fall aus dem Betrieb: der Client hat eine Kachel geleert."""
    vorlage = _ordner(tmp_path, 'vorlage', {
        'Minimap_Color_32256_32256_7.png': b'ganze karte',
        'Minimap_Color_32256_32000_7.png': b'heil',
    })
    ziel = _ordner(tmp_path, 'live', {
        'Minimap_Color_32256_32256_7.png': b'nur was der client sah',
        'Minimap_Color_32256_32000_7.png': b'heil',
    })

    assert minimap.stelleVorlageHer(vorlage, ziel) == 1
    assert (ziel / 'Minimap_Color_32256_32256_7.png').read_bytes() == b'ganze karte'


def test_unveraenderte_karte_wird_nicht_angefasst(tmp_path):
    vorlage = _ordner(tmp_path, 'vorlage', {'Minimap_Color_1_1_7.png': b'gleich'})
    ziel = _ordner(tmp_path, 'live', {'Minimap_Color_1_1_7.png': b'gleich'})

    assert minimap.stelleVorlageHer(vorlage, ziel) == 0


def test_fehlende_kachel_wird_ergaenzt(tmp_path):
    vorlage = _ordner(tmp_path, 'vorlage', {'Minimap_Color_1_1_7.png': b'karte'})
    ziel = _ordner(tmp_path, 'live', {})

    assert minimap.stelleVorlageHer(vorlage, ziel) == 1
    assert (ziel / 'Minimap_Color_1_1_7.png').read_bytes() == b'karte'


def test_eigene_kacheln_und_marker_bleiben_erhalten(tmp_path):
    """Neu erkundete Gebiete und eigene Kartennotizen gehen nicht verloren."""
    vorlage = _ordner(tmp_path, 'vorlage', {'Minimap_Color_1_1_7.png': b'karte'})
    ziel = _ordner(tmp_path, 'live', {
        'Minimap_Color_1_1_7.png': b'karte',
        'Minimap_Color_2_2_7.png': b'selbst erkundet',
        minimap.MARKER_DATEI: b'eigene notizen',
    })

    minimap.stelleVorlageHer(vorlage, ziel)

    assert (ziel / 'Minimap_Color_2_2_7.png').read_bytes() == b'selbst erkundet'
    assert (ziel / minimap.MARKER_DATEI).read_bytes() == b'eigene notizen'


def test_ohne_vorlage_passiert_nichts(tmp_path):
    """Wer die Vorlage nie angelegt hat, soll trotzdem starten koennen."""
    ziel = _ordner(tmp_path, 'live', {'Minimap_Color_1_1_7.png': b'karte'})

    assert minimap.stelleVorlageHer(tmp_path / 'gibt-es-nicht', ziel) == 0
    assert (ziel / 'Minimap_Color_1_1_7.png').read_bytes() == b'karte'
