"""Verbindung zwischen Frontend und Backend.

Lesen: das Frontend liest hass.states["pyscript.audi_dashboard_profil"] usw.
direkt - kein Service-Aufruf mit Rückgabewert. Die Frontend-Dokumentation von
Home Assistant zu response-fähigen Services beschreibt das Verhalten aus
Sicht des Browsers nicht abschließend (Community-Diskussionen deuten auf
Einschränkungen hin); Zustände lesen ist dagegen ein seit Jahren stabiler,
einfacher Weg. Veröffentlicht wird periodisch UND sofort nach jeder
Schreibaktion (siehe frontend_veroeffentlichung.py, dort auch der Hinweis zur
Größengrenze von Zustands-Attributen).

Schreiben: einzig audi_dashboard_profil_schreiben() als generischer Weg für
das gesamte Profil - das Frontend hält Profil, Fahrzeugdaten und
Einstellungen ohnehin als einen zusammenhängenden Stand im Speicher (wie
schon im Prototyp) und schickt ihn nach jeder Änderung komplett zurück,
statt für jedes einzelne Feld einen eigenen Service zu brauchen.
"""

import json

import einstellungen
import entitaeten
import frontend_veroeffentlichung
import profil


@time_trigger("startup")
def beim_start():
    profil.ordner_sicherstellen()
    # Vor der ersten Veröffentlichung anwenden, damit sie die im Setup-Menü
    # gespeicherten Zuordnungen (data/entitaeten.json) schon zeigt, siehe
    # entitaeten.py-Kopfkommentar.
    entitaeten.overrides_anwenden()
    frontend_veroeffentlichung.alles_veroeffentlichen()


@time_trigger("period(now, 20 seconds)")
def periodisch_aktualisieren():
    frontend_veroeffentlichung.fahrzeugstatus_veroeffentlichen()


@time_trigger("period(now, 60 seconds)")
def periodisch_daten_aktualisieren():
    # seltener als der Fahrzeugstatus - Profil/Fahrten/Tankvorgänge ändern
    # sich normalerweise nur durch Aktionen, die ohnehin sofort selbst
    # veröffentlichen (siehe unten); das hier ist nur das Sicherheitsnetz
    # für Änderungen direkt im Dateisystem (§6.2, dritter Bearbeitungsweg).
    frontend_veroeffentlichung.profil_veroeffentlichen()
    frontend_veroeffentlichung.fahrten_veroeffentlichen()
    frontend_veroeffentlichung.tankvorgaenge_veroeffentlichen()


@service
def audi_dashboard_jetzt_aktualisieren():
    """Gegenstück zum "Ziehen zum Aktualisieren" auf der Übersicht: stößt den
    von der Integration bereitgestellten Refresh-Knopf an (siehe
    einstellungen.REFRESH_BUTTON) statt auf den nächsten periodischen Takt zu
    warten, und veröffentlicht den Status danach sofort neu. Ohne
    eingetragenen Knopf (leerer Platzhalter) nur die direkte Neu-
    veröffentlichung - besser als gar nichts, auch wenn dann kein echter neuer
    Abruf beim Fahrzeug passiert. Aufruf als
    pyscript.audi_dashboard_jetzt_aktualisieren."""
    if einstellungen.REFRESH_BUTTON:
        button.press(entity_id=einstellungen.REFRESH_BUTTON)
        task.sleep(3)
    frontend_veroeffentlichung.fahrzeugstatus_veroeffentlichen()
    log.info("audi_dashboard: manuelle Aktualisierung (Ziehen zum Aktualisieren) ausgelöst")


@service
def audi_dashboard_profil_schreiben(profil_json=None):
    """Überschreibt das komplette Fahrzeugprofil. Aufruf als
    pyscript.audi_dashboard_profil_schreiben."""
    if not profil_json:
        log.warning("audi_dashboard: profil_schreiben ohne profil_json aufgerufen")
        return
    p = json.loads(profil_json) if isinstance(profil_json, str) else profil_json
    profil.profil_schreiben(p)
    frontend_veroeffentlichung.profil_veroeffentlichen()
    log.info("audi_dashboard: Profil aktualisiert")


@service
def audi_dashboard_entitaeten_schreiben(zuordnung_json=None):
    """Speichert die im Setup-Menü (Einstellungen -> Fahrzeug einrichten ->
    Setup) gewählte Sensor-zu-Entität-Zuordnung, wendet sie sofort an und
    veröffentlicht Katalog+Status neu, damit Übersicht/Mein Audi ohne
    Neustart die neuen Werte zeigen (Ausnahme: die drei trigger-gebundenen
    Felder, siehe entitaeten.py). Aufruf als
    pyscript.audi_dashboard_entitaeten_schreiben."""
    if not zuordnung_json:
        log.warning("audi_dashboard: entitaeten_schreiben ohne zuordnung_json aufgerufen")
        return
    mapping = json.loads(zuordnung_json) if isinstance(zuordnung_json, str) else zuordnung_json
    entitaeten.overrides_schreiben(mapping)
    entitaeten.overrides_anwenden()
    frontend_veroeffentlichung.entitaeten_veroeffentlichen()
    frontend_veroeffentlichung.fahrzeugstatus_veroeffentlichen()
    log.info("audi_dashboard: Entitäten-Zuordnung aktualisiert")


@service
def audi_dashboard_neustart():
    """Startet Home Assistant neu. Einziger Zweck: eine Änderung an einem der
    drei trigger-gebundenen Setup-Felder (ZUENDUNG_SENSOR/KM_SENSOR/
    TANK_SENSOR, siehe entitaeten.py) wird erst nach einem Neustart wirksam,
    weil @state_trigger die Entity-ID beim Modul-Laden einmalig einliest.
    Wird vom Setup-Popup als expliziter, vom Nutzer bestätigter Knopf
    angeboten - kein automatischer Selbst-Reload direkt nach dem Speichern.
    Aufruf als pyscript.audi_dashboard_neustart."""
    log.info("audi_dashboard: Neustart über das Setup-Menü ausgelöst")
    homeassistant.restart()
