"""Fiók-aktiválás (2026-10-04, E szelet) - docs/AKTIVALAS.md

NYILVÁNOS (bejelentkezés nélküli) végpontok - a token a hitelesítés:
    GET  /aktivalas/{token}     - a jelszóbeállító űrlap (nem módosít semmit)
    POST /aktivalas/{token}     - a jelszó beállítása és a fiók aktiválása

BEJELENTKEZETT végpontok:
    POST /felhasznalok/{id}/aktivalas-ujrakuldes   - új aktiváló link (rendszeradmin, vagy a cég Admin-ja a saját cégében;
                                                     legfeljebb 5 percenként)
    POST /felhasznalok/{id}/aktivalas-kezzel       - kézi aktiválás jelszóval (KIZÁRÓLAG a rendszeradmin)

BIZTONSÁG: a nyilvános oldalak `Referrer-Policy: no-referrer` és `Cache-Control: no-store` fejlécet
kapnak - a token az URL-ben van, és az oldal külső (CDN) stílusokat tölt be: a Referer fejléc nélkül ez
a token nem szivároghat ki. Érvénytelen, lejárt és felhasznált tokenre ugyanaz az oldal jelenik meg.
"""
from fastapi import APIRouter, Request, Depends, Form, status
from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse
from sqlalchemy.orm import Session

import models
import aktivalas_utils
import jelszo_hazirend
from database import get_db
from security import get_current_user, is_rendszeradminisztrator, jelszo_eleg_eros_e, jelszo_tul_hosszu_e, is_company_active
from templates_env import templates

router = APIRouter()

_FEJLECEK = {"Referrer-Policy": "no-referrer", "Cache-Control": "no-store"}


def _oldal(request: Request, ervenyes: bool, token: str = "", user=None, hiba: str = "", status_code: int = 200):
    # v36: a cég jelszó-házirendje (követelmények szövege + minimum hossz) - csak érvényes tokennél, azaz ha ismert a felhasználó (és a cége)
    hazirend = None
    if user is not None:
        from database import SessionLocal
        d = SessionLocal()
        try:
            szab = jelszo_hazirend.szabalyok_cegre(d, user.company_id)
            hazirend = {"min_hossz": szab.min_hossz, "szoveg": jelszo_hazirend.kovetelmeny_szoveg(szab), "aktiv": szab.bonyolultsag_aktiv}
        finally:
            d.close()
    resp = templates.TemplateResponse(
        request=request, name="aktivalas.html",
        context={"ervenyes": ervenyes, "token": token, "felhasznalo": user, "hiba": hiba, "hazirend": hazirend},
        status_code=status_code)
    for k, v in _FEJLECEK.items():
        resp.headers[k] = v
    return resp


@router.get("/aktivalas/{token}", response_class=HTMLResponse)
def aktivalas_oldal(token: str, request: Request, db: Session = Depends(get_db)):
    talalat = aktivalas_utils.token_ellenorzes(db, token)
    if talalat is None:
        return _oldal(request, ervenyes=False, status_code=404)
    return _oldal(request, ervenyes=True, token=token, user=talalat[1])


@router.post("/aktivalas/{token}")
def aktivalas_vegrehajtasa(
    token: str,
    request: Request,
    uj_jelszo: str = Form(...),
    uj_jelszo2: str = Form(...),
    db: Session = Depends(get_db),
):
    talalat = aktivalas_utils.token_ellenorzes(db, token)
    if talalat is None:
        return _oldal(request, ervenyes=False, status_code=404)
    sor, user = talalat
    if uj_jelszo != uj_jelszo2:
        return _oldal(request, True, token, user, "A két jelszó nem egyezik!", 400)
    if jelszo_tul_hosszu_e(uj_jelszo):
        return _oldal(request, True, token, user, "A jelszó túl hosszú (legfeljebb 72 bájt, azaz kb. 36-72 karakter lehet)!", 400)
    if not jelszo_eleg_eros_e(uj_jelszo):
        return _oldal(request, True, token, user, "A jelszónak legalább 6 karakter hosszúnak kell lennie!", 400)
    hazirend_hiba = jelszo_hazirend.ellenorzes(db, user, uj_jelszo)           # v36: a cég jelszó-házirendje
    if hazirend_hiba:
        return _oldal(request, True, token, user, hazirend_hiba, 400)

    if not aktivalas_utils.aktival(db, sor, user, uj_jelszo):
        # Egy párhuzamos kérés (vagy dupla kattintás) már felhasználta a tokent
        return _oldal(request, ervenyes=False, status_code=404)
    # 2FA (3. fázis): ha a cégnél kötelező a kétlépcsős hitelesítés, a beállítás az ELSŐ BELÉPÉSKOR következik
    # (routers/auth.py login_post -> /mfa/beallitas); az aktiválás után a /login-ra irányítunk, ott dől el.
    resp = RedirectResponse(url="/login?aktivalva=1", status_code=status.HTTP_303_SEE_OTHER)
    for k, v in _FEJLECEK.items():
        resp.headers[k] = v
    return resp


def _celfelhasznalo_es_jog(db: Session, current_user, user_id: int):
    """(célfelhasználó, hibaválasz). A rendszeradmin bárkit, a cég Admin-ja csak a saját cége felhasználóit kezelheti."""
    if current_user.csak_olvasas:
        return None, JSONResponse(status_code=403, content={"message": "Csak megtekintési jogosultsággal rendelkezel, szerkesztés nem lehetséges!"})
    target = db.query(models.User).filter(models.User.id == user_id).first()
    jog = target is not None and (is_rendszeradminisztrator(current_user) or (
        current_user.role == "Admin" and target.company_id == current_user.company_id))
    # Nem létező és nem jogosult cél UGYANAZT a választ kapja (különben a cég-adminok a válaszból
    # kitalálhatnák, mely felhasználó-azonosítók léteznek más cégeknél).
    if not jog:
        return None, JSONResponse(status_code=403, content={"message": "Nincs jogosultságod!"})
    if not is_company_active(target.company_id, db):
        return None, JSONResponse(status_code=403, content={"message": "Ez a cég inaktív státuszú, a felhasználó adatai nem szerkeszthetők!"})
    return target, None


def _vissza(request: Request, alap: str):
    return RedirectResponse(url=request.headers.get("referer") or alap, status_code=status.HTTP_303_SEE_OTHER)


@router.post("/felhasznalok/{user_id}/aktivalas-ujrakuldes")
def aktivalas_ujrakuldese(
    user_id: int,
    request: Request,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user),
):
    target, hiba = _celfelhasznalo_es_jog(db, current_user, user_id)
    if hiba is not None:
        return hiba
    aktivalas_utils.ujrakuldes(db, target, current_user)
    return _vissza(request, "/felhasznalok")


@router.post("/felhasznalok/{user_id}/aktivalas-kezzel")
def aktivalas_kezzel(
    user_id: int,
    request: Request,
    uj_jelszo: str = Form(...),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user),
):
    # KIZÁROLAG a rendszeradmin (a cég Admin-ja nem): a kézi aktiválás megkerüli az e-mail-megerősítést.
    if not is_rendszeradminisztrator(current_user):
        return JSONResponse(status_code=403, content={"message": "Csak a rendszeradminisztrátor aktiválhat kézzel!"})
    target, hiba = _celfelhasznalo_es_jog(db, current_user, user_id)
    if hiba is not None:
        return hiba
    if jelszo_tul_hosszu_e(uj_jelszo):
        return JSONResponse(status_code=400, content={"message": "A jelszó túl hosszú (legfeljebb 72 bájt lehet)!"})
    if not jelszo_eleg_eros_e(uj_jelszo):
        return JSONResponse(status_code=400, content={"message": "A jelszónak legalább 6 karakter hosszúnak kell lennie!"})
    hazirend_hiba = jelszo_hazirend.ellenorzes(db, target, uj_jelszo)         # v36: a cég jelszó-házirendje
    if hazirend_hiba:
        return JSONResponse(status_code=400, content={"message": hazirend_hiba})
    aktivalas_utils.kezi_aktivalas(db, target, current_user, uj_jelszo)
    return _vissza(request, "/felhasznalok")
