"""Tod: alles rund um Sterben, Bergung und Notfall-Nachkauf.

Einklappbare Ueberkategorien (Klick auf den Kopf) und "?"-Erklaerungen
in einfachem Deutsch. Jede Aenderung gilt sofort und wird im Profil
gespeichert (getDeathConfig/setDeathConfig im UI-Context).
"""
import customtkinter

from src.ui import theme
from src.ui.widgets import CollapsibleCard, InfoTip, positiveInt


class DeathPage(customtkinter.CTkFrame):
    def __init__(self, master, context):
        super().__init__(master, fg_color='transparent')
        self.context = context
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

        scroll = customtkinter.CTkScrollableFrame(
            self, fg_color='transparent')
        scroll.grid(row=0, column=0, sticky='nsew')
        scroll.grid_columnconfigure(0, weight=1)
        self.body = scroll

        self.config = self.context.getDeathConfig()
        self._buildRecoveryCard()
        self._buildRefillCard()
        self._buildDetectionCard()

    # ------------------------------------------------------------------ Karten
    def _buildRecoveryCard(self):
        card = CollapsibleCard(
            self.body, 'Bergung',
            'Was passiert, nachdem du gestorben bist')
        card.grid(row=0, column=0, pady=(0, 10), sticky='ew')
        self._switchRow(
            card.body, 0, 'Automatische Bergung',
            'Der Bot läuft nach dem Tod selbst zu deiner Leiche, holt '
            'deine Sachen zurück und macht mit der Jagd weiter. Aus = der '
            'Bot hält einfach an und wartet auf dich.',
            'enabled')
        self._switchRow(
            card.body, 1, 'Bei Spieler-Kill pausieren',
            'Wurdest du von einem anderen Spieler getötet, stoppt der Bot '
            'und schreibt eine Nachricht ins Ereignis-Log. Aus = er bergt '
            'deine Leiche auch nach einem Spieler-Kill automatisch.',
            'pauseOnPlayerKill')

    def _buildRefillCard(self):
        card = CollapsibleCard(
            self.body, 'Notfall-Nachkauf',
            'Ein paar Tränke kaufen, bevor es zur Leiche geht')
        card.grid(row=1, column=0, pady=(0, 10), sticky='ew')
        self._numberRow(
            card.body, 0, 'Max. Tränke pro Sorte', 'refillCap',
            'So viele Tränke kauft der Bot nach dem Tod höchstens — nicht '
            'mehr. Deine alten Tränke liegen ja noch in deiner Leiche und '
            'kommen beim Bergen wieder dazu.')
        self._numberRow(
            card.body, 1, 'Mindest-Tränke vor Bergung', 'minPotions',
            'Erst wenn du wieder so viele Tränke hast, läuft der Bot zu '
            'deiner Leiche. Ohne Tränke würde er auf dem Weg einfach '
            'wieder sterben.')
        self._numberRow(
            card.body, 2, 'Nachkauf-Abbruch (Minuten)', 'refillTimeoutMinutes',
            'Wenn der Einkauf nach so vielen Minuten nicht geklappt hat '
            '(kein Gold, NPC blockiert), bergt der Bot trotzdem — statt '
            'ewig im Shop zu warten.')

    def _buildDetectionCard(self):
        card = CollapsibleCard(
            self.body, 'Erkennung & Abbruch',
            'Woran der Bot erkennt, wer dich getötet hat')
        card.grid(row=2, column=0, pady=(0, 10), sticky='ew')
        self._numberRow(
            card.body, 0, 'PK-Erkennung (Sekunden)', 'killerWindowSeconds',
            'War in den letzten so vielen Sekunden vor deinem Tod ein '
            'fremder Spieler auf dem Bildschirm, zählt der Tod als '
            'Spieler-Kill. Sonst als Monster-Kill.')
        self._numberRow(
            card.body, 1, 'Bergungs-Abbruch (Minuten)', 'recoveryTimeoutMinutes',
            'Nach so vielen Minuten bricht der Bot die Bergung ab (z. B. '
            'wenn die Leiche unerreichbar ist) und macht ganz normal mit '
            'der Jagd weiter.')

    # ------------------------------------------------------------------ Zeilen
    def _switchRow(self, parent, row, label, tip, key):
        frame = customtkinter.CTkFrame(parent, fg_color='transparent')
        frame.grid(row=row, column=0, sticky='ew', pady=4)
        frame.grid_columnconfigure(0, weight=1)
        customtkinter.CTkLabel(
            frame, text=label, font=theme.font(13),
        ).grid(row=0, column=0, sticky='w')
        InfoTip(frame, tip).grid(row=0, column=1, padx=8)
        switch = customtkinter.CTkSwitch(
            frame, text='', progress_color=theme.ACCENT,
            command=lambda: self._set(key, switch.get() == 1),
        )
        switch.grid(row=0, column=2, sticky='e')
        if self.config.get(key):
            switch.select()

    def _numberRow(self, parent, row, label, key, tip):
        frame = customtkinter.CTkFrame(parent, fg_color='transparent')
        frame.grid(row=row, column=0, sticky='ew', pady=4)
        frame.grid_columnconfigure(0, weight=1)
        customtkinter.CTkLabel(
            frame, text=label, font=theme.font(13),
        ).grid(row=0, column=0, sticky='w')
        InfoTip(frame, tip).grid(row=0, column=1, padx=8)
        entry = customtkinter.CTkEntry(
            frame, width=90, justify='center', font=theme.font(13),
            validate='key',
            validatecommand=(self.register(positiveInt), '%P'),
        )
        entry.insert(0, str(self.config.get(key, '')))
        entry.grid(row=0, column=2, sticky='e')
        entry.bind('<Return>', lambda _e: self._saveNumber(key, entry))
        entry.bind('<FocusOut>', lambda _e: self._saveNumber(key, entry))

    # ------------------------------------------------------------------ Speichern
    def _set(self, key, value):
        self.config[key] = value
        self.context.setDeathConfig(self.config)

    def _saveNumber(self, key, entry):
        text = entry.get().strip()
        if not text:
            entry.delete(0, 'end')
            entry.insert(0, str(self.config.get(key, '')))
            return
        value = int(text)
        if value != self.config.get(key):
            self._set(key, value)
