"""Levél-feliratkozások felületei (2026-10-04, e-mail rendszer C szelete).

KÉT OLDAL:
    /ertesitesek            - minden bejelentkezett felhasználó: a SAJÁT feliratkozásai (azt kapcsolhatja
                              ki/be, amit a cégadmin szabálya megenged)
    /ertesitesi-szabalyok   - a cég Admin-ja (és a rendszeradmin a kiválasztott cég munkakörnyezetében):
                              szerepkörönként és kategóriánként kötelező / alapból be / alapból ki / tiltott,
                              + csak olvasható áttekintés arról, kinek mi megy most

A logika az email_feliratkozas.py-ban van; itt csak a jogosultság-ellenőrzés és az űrlapkezelés. Mindkét
mentő végpont POST (a SameSite=Lax süti miatt GET-tel nem módosítunk állapotot).
Részletek: docs/FELIRATKOZASOK.md
"""
from typing import Optional

from fastapi import APIRouter, Request, Depends
from fastapi.responses import HTMLResponse, RedirectResponse
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import Session

import models
import email_feliratkozas as ef
from database import get_db
from security import get_current_user, get_working_company_id, is_company_active
from templates_env import templates

router = APIRouter()


# =============================================================================================
# 1. A FELHASZNÁLÓ SAJÁT OLDALA
# =============================================================================================
@router.get("/ertesitesek", response_class=HTMLResponse)
def ertesitesek_oldal(
    request: Request,
    mentve: Optional[int] = None,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    allapotok = ef.felhasznaloi_allapot(db, current_user)
    return templates.TemplateResponse(
        request=request,
        name="ertesitesek.html",
        context={
            "user": current_user,
            "allapotok": allapotok,
            "van_lathato": any(a["lathato"] for a in allapotok),
            "mentve": mentve,
            "admin_e": current_user.role == "Admin",
        }
    )


@router.post("/ertesitesek")
async def ertesitesek_mentese(
    request: Request,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    # A saját feliratkozás személyes beállítás (mint a jelszócsere): a csak megtekintési (csak_olvasas)
    # fiók is módosíthatja, mert nem céges adatot ír.
    urlap = await request.form()
    user_id = current_user.id
    for _ in range(2):                    # dupla kattintás/párhuzamos mentés: az egyediségi kulcs ütközésekor újra
        valtozott = []
        try:
            user = db.get(models.User, user_id)
            for a in ef.felhasznaloi_allapot(db, user):
                if not a["modosithato"]:
                    continue              # kötelező / tiltott: a beküldött érték nem számít
                uj = urlap.get("kat_" + a["kod"]) == "on"
                if uj != a["kap"] and ef.valasztas_beallitasa(db, user, a["kod"], uj):
                    valtozott.append(f"{a['nev']}: {'be' if uj else 'ki'}")
            if valtozott:
                db.add(models.AuditLog(
                    company_id=user.company_id, user_id=user.id,
                    field_name="Levél-feliratkozás (saját)", old_value="-", new_value="; ".join(valtozott)))
            db.commit()
            break
        except IntegrityError:
            db.rollback()
    # v35: a Profilom oldalról érkező mentés (rejtett `vissza=profil` mező) oda is tér vissza; más érték nem számít (nincs szabad átirányítás)
    if urlap.get("vissza") == "profil":
        return RedirectResponse(url="/profil?ok=ertesitesek_mentve#ertesitesek", status_code=303)
    # v41: a Beállítások "E-mail riportok" füléről érkező mentés (`vissza=beallitasok`) oda tér vissza; más érték nem számít
    if urlap.get("vissza") == "beallitasok":
        return RedirectResponse(url="/beallitasok?uzenet=ertesitesek_mentve#tab-email", status_code=303)
    return RedirectResponse(url="/ertesitesek?mentve=1", status_code=303)


# =============================================================================================
# 2. A CÉGES ADMIN OLDALA
# =============================================================================================
def _szabaly_mezo(szerepkor_index: int, kategoria: str) -> str:
    return f"szab__{szerepkor_index}__{kategoria}"


def _eredeti_mezo(szerepkor_index: int, kategoria: str) -> str:
    """A megjelenítéskor látott érték rejtett mezője: csak azt a cellát mentjük, amit a beküldő tényleg
    megváltoztatott (így egy elavult űrlap nem írja felül egy másik admin közben mentett módosítását)."""
    return f"eredeti__{szerepkor_index}__{kategoria}"


@router.get("/ertesitesi-szabalyok", response_class=HTMLResponse)
def szabalyok_oldal(
    request: Request,
    mentve: Optional[int] = None,
    hiba: Optional[str] = None,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    if current_user.role != "Admin":
        return RedirectResponse(url="/valassz-modult", status_code=303)

    ceg_id = get_working_company_id(current_user, request)
    ceg = db.get(models.Company, ceg_id) if ceg_id else None
    szabalyok = ef.szabalyok_betoltese(db, ceg_id)
    attekintes = ef.ceges_attekintes(db, ceg_id)
    return templates.TemplateResponse(
        request=request,
        name="ertesitesi_szabalyok.html",
        context={
            "user": current_user,
            "ceg": ceg,
            "szerepkorok": list(enumerate(ef.SZEREPKOROK)),
            "kategoriak": ef.KATEGORIAK,
            "modok": [(m, ef.MOD_CIMKEK[m]) for m in ef.MODOK],
            "szabalyok": szabalyok,
            "attekintes": attekintes,
            "darabok": ef.cimzett_darabszamok(attekintes),
            "mezo": _szabaly_mezo,
            "mezo_eredeti": _eredeti_mezo,
            "inaktiv_ceg": ceg is None or ceg.aktiv is False,
            "mentve": mentve,
            "hiba": hiba,
            "csak_olvasas": bool(current_user.csak_olvasas),
        }
    )


@router.post("/ertesitesi-szabalyok")
async def szabalyok_mentese(
    request: Request,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    if current_user.role != "Admin":
        return RedirectResponse(url="/valassz-modult", status_code=303)

    ceg_id = get_working_company_id(current_user, request)
    if not ceg_id or not is_company_active(ceg_id, db):
        return RedirectResponse(url="/ertesitesi-szabalyok?hiba=inaktiv_ceg", status_code=303)
    if current_user.csak_olvasas:
        return RedirectResponse(url="/ertesitesi-szabalyok?hiba=csak_olvasas", status_code=303)

    urlap = await request.form()
    user_id = current_user.id
    for _ in range(2):                    # párhuzamos mentés: az egyediségi kulcs ütközésekor újra
        ervenytelen = False
        try:
            kuldo = db.get(models.User, user_id)
            for i, szerepkor in enumerate(ef.SZEREPKOROK):
                for kod in ef.KATEGORIA_KODOK:
                    mod = urlap.get(_szabaly_mezo(i, kod))
                    if mod is None:
                        continue          # ez a mező nem érkezett: nem módosítjuk
                    if urlap.get(_eredeti_mezo(i, kod)) == mod:
                        continue          # a beküldő nem változtatott rajta: ne írjuk felül mások módosítását
                    try:
                        ef.szabaly_beallitasa(db, ceg_id, szerepkor, kod, mod, kuldo)
                    except ValueError:
                        ervenytelen = True    # pl. az Admin szerepkör "tiltott"-ra állítása: kihagyjuk, jelezzük
            db.commit()
            break
        except IntegrityError:
            db.rollback()
    return RedirectResponse(url="/ertesitesi-szabalyok?" + ("hiba=ervenytelen" if ervenytelen else "mentve=1"),
                            status_code=303)
