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

import models
from database import get_db
from security import get_current_user, is_rendszeradminisztrator, get_user_modul_kodok
from naplo_utils import naploz, be_ki
from templates_env import templates

router = APIRouter()

MODUL_HOME_UTVONALAK = {
    "EMELOGEP": "/",
    "TUZVEDELEM": "/tuzvedelem/dashboard",
    "EBK": "/ebk/dashboard",
    "VIVU": "/vivu/dashboard",
}


@router.get("/valassz-modult", response_class=HTMLResponse)
def valassz_modult(
    request: Request,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    sajat_modul_kodok = get_user_modul_kodok(current_user, db)
    aktiv_modulok = db.query(models.Modul).filter(
        models.Modul.aktiv == True, models.Modul.kod.in_(sajat_modul_kodok)
    ).all() if sajat_modul_kodok else []

    is_rendszeradmin = is_rendszeradminisztrator(current_user)

    # A rendszeradminisztrátori csempe miatt a rendszeradminnak akkor is meg kell mutatni
    # a választó képernyőt, ha épp csak egyetlen modulja lenne - neki mindig van hova
    # tovább navigálnia (a rendszeradminisztráció csempére).
    if len(aktiv_modulok) == 1 and not is_rendszeradmin:
        cel = MODUL_HOME_UTVONALAK.get(aktiv_modulok[0].kod, "/lista")
        return RedirectResponse(url=cel, status_code=303)

    return templates.TemplateResponse(
        request=request,
        name="valassz_modult.html",
        context={
            "user": current_user,
            "modulok": aktiv_modulok,
            "modul_utvonalak": MODUL_HOME_UTVONALAK,
            "is_rendszeradmin": is_rendszeradmin,
        }
    )


@router.get("/rendszeradmin/modulok")
def rendszeradmin_modulok_redirect():
    """Az önálló modul-kezelő oldal beolvadt a rendszeradmin felületbe (v30: az új áttekintő /rendszeradmin a főoldal)."""
    return RedirectResponse(url="/rendszeradmin", status_code=303)


@router.post("/rendszeradmin/cegmodul/{company_id}/{modul_id}")
def valt_ceg_modul(
    company_id: int,
    modul_id: int,
    request: Request,
    bekapcsolva: str = Form(...),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    if not is_rendszeradminisztrator(current_user):
        return JSONResponse(status_code=403, content={"message": "Csak a rendszeradminisztrátor!"})

    ceg = db.query(models.Company).filter(models.Company.id == company_id).first()
    modul = db.query(models.Modul).filter(models.Modul.id == modul_id).first()
    if not ceg or not modul:
        return JSONResponse(status_code=404, content={"message": "Cég vagy modul nem található!"})

    be = (bekapcsolva == "on")
    volt = modul in ceg.engedelyezett_modulok
    elvett_felhasznalok = 0
    if be and modul not in ceg.engedelyezett_modulok:
        ceg.engedelyezett_modulok.append(modul)
    elif not be and modul in ceg.engedelyezett_modulok:
        ceg.engedelyezett_modulok.remove(modul)
        # Ha a cégtől megvonjuk a modult, a cég felhasználóitól is levesszük a
        # konkrét hozzárendelést, hogy ne maradjon "árva" jogosultság a háttérben.
        for felhasznalo in ceg.users:
            if modul in felhasznalo.sajat_modulok:
                felhasznalo.sajat_modulok.remove(modul)
                elvett_felhasznalok += 1

    # J-20 (v77): a modul-előfizetés változása naplózódik (a megvonás következménye - hány felhasználótól vettük el - az új értékben)
    uj_szoveg = f"{modul.kod}: {be_ki(be)}" + (f" ({elvett_felhasznalok} felhasználótól elvéve)" if elvett_felhasznalok else "")
    naploz(db, current_user, ceg.id, "Cég modul-előfizetés", f"{modul.kod}: {be_ki(volt)}", uj_szoveg, csak_ha_valtozott=True)
    db.commit()
    return JSONResponse(status_code=200, content={"message": "Mentve."})


@router.post("/rendszeradmin/usermodul/{user_id}/{modul_id}")
def valt_user_modul(
    user_id: int,
    modul_id: int,
    request: Request,
    bekapcsolva: str = Form(...),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    if not is_rendszeradminisztrator(current_user):
        return JSONResponse(status_code=403, content={"message": "Csak a rendszeradminisztrátor!"})

    cel_user = db.query(models.User).filter(models.User.id == user_id).first()
    modul = db.query(models.Modul).filter(models.Modul.id == modul_id).first()
    if not cel_user or not modul:
        return JSONResponse(status_code=404, content={"message": "Felhasználó vagy modul nem található!"})

    if modul not in cel_user.ceg.engedelyezett_modulok:
        return JSONResponse(status_code=400, content={"message": "A cége nincs előfizetve erre a modulra!"})

    be = (bekapcsolva == "on")
    volt = modul in cel_user.sajat_modulok
    if be and modul not in cel_user.sajat_modulok:
        cel_user.sajat_modulok.append(modul)
    elif not be and modul in cel_user.sajat_modulok:
        cel_user.sajat_modulok.remove(modul)

    # J-20 (v77): a felhasználó modul-jogának változása naplózódik
    naploz(db, current_user, cel_user.company_id, "Modulok igazítása (rendszeradmin, felhasználó modul-jog)",
           f"{cel_user.username}: {modul.kod} {be_ki(volt)}", f"{cel_user.username}: {modul.kod} {be_ki(be)}", csak_ha_valtozott=True)
    db.commit()
    return JSONResponse(status_code=200, content={"message": "Mentve."})
