"""PROFILOM (v35): a bejelentkezett felhasználó saját beállításai egy oldalon - leírás: docs/PROFIL_ES_SZABADSAG.md.

A jobb felső felhasználó-menü korábban két külön elemet kínált (Jelszavam módosítása modal, Értesítéseim oldal); helyettük egyetlen "Profilom" hivatkozás van
(`/profil`), ahol az alábbiak vannak:
    * Fiók adatai (csak olvasható)
    * Szabadságon vagyok  (POST /profil/szabadsag; szabadsag_utils.py): a szabadság alatt nem megy levél, a visszatéréskor egy összegző érkezik
    * Értesítéseim        (a levél-feliratkozások; a mentés a meglévő POST /ertesitesek, `vissza=profil` jelzéssel ide tér vissza)
    * Jelszó módosítása   (a meglévő POST /sajat-jelszo-csere, a közös _sajat_jelszo_form.html űrlap)
    * Kétlépcsős hitelesítés (a mentőkódok oldalának hivatkozása, ha a felhasználónak van megerősített 2FA-ja)

Minden módosítás személyes beállítás (mint a jelszócsere): a csak megtekintési (csak_olvasas) fiók is használhatja, mert nem céges adatot ír.
A GET csak megjelenít; a módosítás POST, kérés-eredet védelemmel (Sec-Fetch-Site).
"""
from typing import Optional

from fastapi import APIRouter, Depends, Form, Query, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from sqlalchemy.orm import Session

import email_feliratkozas as ef
import jelszo_hazirend
import mentokod_utils
import models
import szabadsag_utils
from database import get_db
from routers import mfa as mfa_router
from security import get_current_user
from templates_env import templates

router = APIRouter()

JELZESEK_OK = {
    "szabadsag_be": "A szabadságod bekapcsolva: a következő időszakban nem küldünk neked e-mailt (a fiókodat védő biztonsági értesítők kivételével). A visszatéréskor egy összegző levelet kapsz.",
    "szabadsag_datum": "A visszatérés napja módosítva.",
    "szabadsag_nincs_valtozas": "Nem változott semmi.",
    "ertesitesek_mentve": "Az értesítési beállításaid mentve.",
}


def _oldal(request: Request, db: Session, user: models.User, ok: Optional[str] = None, hiba: Optional[str] = None,
           ok_szoveg: Optional[str] = None, status_code: int = 200):
    allapotok = ef.felhasznaloi_allapot(db, user)
    return templates.TemplateResponse(
        request=request,
        name="profil.html",
        status_code=status_code,
        context={
            "user": user,
            "ok_uzenet": ok_szoveg or JELZESEK_OK.get(ok or ""),
            "hiba_uzenet": hiba,
            "szabadsag": szabadsag_utils.allapot(db, user),
            "allapotok": allapotok,
            "van_lathato": any(a["lathato"] for a in allapotok),
            "admin_e": user.role == "Admin",
            "vissza_profilra": True,
            "jelszo_info": jelszo_hazirend.allapot(db, user),            # v36: lejárat, követelmények (a jelszó-kártya)
            "jelszo_min_hossz": jelszo_hazirend.szabalyok_cegre(db, user.company_id).min_hossz,
            "mfa_kesz": bool(user.totp_megerositve),
            "mentokod_maradt": mentokod_utils.hatralevo(db, user.id) if user.totp_megerositve else 0,
            "mentokod_kuszob": mentokod_utils.FIGYELMEZTETO_KUSZOB,
        },
        headers={"Cache-Control": "no-store"},
    )


@router.get("/profil", response_class=HTMLResponse)
def profil_oldal(
    request: Request,
    ok: Optional[str] = None,
    n: Optional[int] = Query(None, ge=0, le=1000000),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    """A Profilom oldal. Csak megjelenít. `ok` (előre ismert kód) a sikeres műveletek visszajelzése; a `szabadsag_ki` darabszámot (`n`) is kap."""
    szoveg = None
    if ok == "szabadsag_ki":
        szoveg = ("A szabadságod véget ért, jó munkát! " + (f"A szabadságod alatt kimaradt {n} levélről összegző levelet küldtünk (hamarosan megérkezik)."
                                                           if n else "A szabadságod alatt nem maradt ki levél."))
    return _oldal(request, db, current_user, ok=ok, ok_szoveg=szoveg)


@router.post("/profil/szabadsag")
async def profil_szabadsag_mentese(
    request: Request,
    aktiv: str = Form(""),
    visszateres: str = Form(""),
    vissza: str = Form(""),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    """A "Szabadságon vagyok" kapcsoló mentése. `aktiv`="on": bekapcsolva (a `visszateres` opcionális visszatérési nap, ÉÉÉÉ-HH-NN); különben kikapcsolva.
    Ki-/bekapcsolás, dátum-módosítás: lásd szabadsag_utils.py. A kikapcsolás egy tranzakcióban lezárja a szabadságot és sorba állítja az összegzőt."""
    if mfa_router._idegen_eredet(request):
        return _oldal(request, db, current_user, hiba="A kérés nem erről az oldalról érkezett.", status_code=403)

    # v41: a Beállítások "E-mail riportok" füléről érkező űrlap (rejtett `vissza=beallitasok` mező) oda tér vissza (előre ismert `uzenet` / `hiba` kóddal, nem szabad szöveggel);
    # más érték nem számít (nincs szabad átirányítás). Egyébként a Profilom oldal.
    vb = (vissza == "beallitasok")
    def kesz(kod: str, n: Optional[int] = None) -> RedirectResponse:
        if vb:
            return RedirectResponse(url=f"/beallitasok?uzenet={kod}" + (f"&n={n}" if n is not None else "") + "#tab-email", status_code=303)
        return RedirectResponse(url=f"/profil?ok={kod}" + (f"&n={n}" if n is not None else "") + "#szabadsag", status_code=303)

    be = (aktiv == "on")
    nap = None
    if be:
        nap, hiba = szabadsag_utils.visszateres_ellenorzese(visszateres)
        if hiba:
            if vb:
                kod = "szabadsag_datum_formatum" if hiba.startswith("Érvénytelen") else "szabadsag_datum_multban" if "jövőben legyen" in hiba else "szabadsag_datum_tavoli"
                return RedirectResponse(url=f"/beallitasok?hiba={kod}#tab-email", status_code=303)
            return _oldal(request, db, current_user, hiba=hiba, status_code=400)

    user_id = current_user.id
    volt = bool(current_user.szabadsagon)
    try:
        if be and not volt:
            szabadsag_utils.kezdes(db, current_user, nap)
            db.commit()
            return kesz("szabadsag_be")
        if be and volt:
            valtozott = szabadsag_utils.datum_modositasa(db, current_user, nap)
            db.commit()
            return kesz("szabadsag_datum" if valtozott else "szabadsag_nincs_valtozas")
        if volt:
            darab = szabadsag_utils.befejezes(db, current_user)
            db.commit()
            return kesz("szabadsag_ki", darab)
    except Exception as ex:
        db.rollback()
        print(f"❌ A szabadság mentése sikertelen (felhasználó #{user_id}): {type(ex).__name__}: {ex}")
        if vb:
            return RedirectResponse(url="/beallitasok?hiba=mentes_sikertelen#tab-email", status_code=303)
        return _oldal(request, db, db.get(models.User, user_id), hiba="A mentés nem sikerült, próbáld újra.", status_code=500)
    return kesz("szabadsag_nincs_valtozas")
