import tomllib

from markdown import markdown
from pydantic import BaseModel, ConfigDict, field_validator

from .dav.webdav import WebDAV
from .settings import SETTINGS, Credentials
from .transformed_string import TransformedString


class Site(BaseModel):
    model_config = ConfigDict(validate_default=True)

    # Titel
    title: str

    # Untertitel
    subtitle: str

    # Inhalt der Seite
    content: str

    # Fußzeile der Seite
    footer: str = "**Advent22** by [Lenaisten e.V.](//www.lenaisten.de)"

    @field_validator("content", "footer", mode="after")
    def parse_md(cls, v) -> str:
        return markdown(v)


class Puzzle(BaseModel):
    # Tag, an dem der Kalender startet
    begin_day: int = 1

    # Monat, in dem der Kalender startet
    begin_month: int = 12

    # Kalender so viele Tage nach der letzten Türöffnung schließen
    close_after: int = 90

    # Tage, für die kein Buchstabe vorgesehen wird
    extra_days: set[int] = set()

    # Türchen ohne Buchstabe überspringen
    skip_empty: bool = True


class Image(BaseModel):
    # Quadrat, Seitenlänge in px
    size: int = 1000

    # Rand in px, wo keine Buchstaben untergebracht werden
    border: int = 60


class Config(BaseModel):
    # Login-Daten für Admin-Modus
    admin: Credentials

    # Lösungswort
    solution: TransformedString

    # Weitere Einstellungen
    site: Site
    puzzle: Puzzle
    image: Image

    # Kalenderdefinition
    calendar: str = "default.toml"

    # Serverseitiger zusätzlicher "random" seed
    random_seed: str = ""


async def get_config() -> Config:
    """
    Globale Konfiguration lesen
    """

    txt = await WebDAV.read_str(path=SETTINGS.webdav.config_filename)
    return Config.model_validate(tomllib.loads(txt))
