from fastapi import APIRouter, Request, Depends, Form
from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse
from sqlalchemy.orm import Session

import models
import partner_ceg_utils as pcu
from database import get_db
from security import get_current_user, get_working_company_id, is_company_active, require_modul, irasi_tiltas_oka, IRASI_TILTAS_UZENETEK
from templates_env import templates

router = APIRouter(dependencies=[Depends(require_modul("EMELOGEP"))])


def _jogosult_e(current_user) -> bool:
    return current_user.role in ("Admin", "Emelőgép ügyintéző")


@router.get("/partner-cegek", response_class=HTMLResponse)
def partner_cegek_oldal(
    request: Request,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    """Partner-cégek: kódos, kölcsönös hozzájáruláson alapuló összekapcsolás két EmeLOG-ot
    használó cég között - a bérbeadás/kihelyezés bérlő-választója mostantól csak az itt felvett
    partnereket ajánlja fel, nem az összes rendszerben lévő céget (l. partner_ceg_utils.py)."""
    if not _jogosult_e(current_user):
        return RedirectResponse(url="/lista", status_code=303)

    working_company_id = get_working_company_id(current_user, request)

    return templates.TemplateResponse(
        request=request,
        name="partner_cegek.html",
        context={
            "user": current_user,
            "partnersegek": pcu.partnersegek_listaja(db, working_company_id),
            "sajat_kodok": pcu.sajat_aktiv_kodok(db, working_company_id),
        }
    )


@router.post("/partner-cegek/kod-generalasa")
def kod_generalasa(
    request: Request,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    if not _jogosult_e(current_user):
        return JSONResponse(status_code=403, content={"message": "Nincs jogosultságod!"})

    working_company_id = get_working_company_id(current_user, request)
    if not is_company_active(working_company_id, db):
        return JSONResponse(status_code=403, content={"message": "Ez a cég inaktív státuszú!"})
    if current_user.csak_olvasas:
        return JSONResponse(status_code=403, content={"message": "Csak megtekintési jogosultsággal rendelkezel!"})

    nyers_kod = pcu.kod_general(db, working_company_id, current_user.id)
    db.add(models.AuditLog(
        company_id=working_company_id, user_id=current_user.id, field_name="Partner-meghívókód generálva",
        old_value="-", new_value=f"Lejár: {pcu.KOD_ERVENYESSEG_ORA} óra múlva"
    ))
    db.commit()

    return JSONResponse(status_code=200, content={
        "message": "Meghívókód létrehozva! Ezt a kódot MAGADNAK kell átadnod a partner cégnek - a rendszer nem küldi el senkinek.",
        "kod": nyers_kod,
        "ervenyesseg_ora": pcu.KOD_ERVENYESSEG_ORA,
    })


@router.post("/partner-cegek/kod-torlese")
def kod_torlese(
    request: Request,
    kod_id: int = Form(...),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    """Egy saját, még fel nem használt meghívókód visszavonása (pl. ha rossz embernek készült,
    vagy már nincs rá szükség)."""
    if not _jogosult_e(current_user):
        return JSONResponse(status_code=403, content={"message": "Nincs jogosultságod!"})

    working_company_id = get_working_company_id(current_user, request)
    # J-09 (v65): a csak_olvasas mellé a cég-aktív ellenőrzés is kell
    tiltas = irasi_tiltas_oka(current_user, working_company_id, db)
    if tiltas:
        return JSONResponse(status_code=403, content={"message": IRASI_TILTAS_UZENETEK[tiltas]})
    siker = pcu.kod_visszavonasa(db, working_company_id, kod_id)
    if not siker:
        return JSONResponse(status_code=404, content={"message": "A kód nem található, már felhasználták, vagy már lejárt!"})

    db.commit()
    return JSONResponse(status_code=200, content={"message": "Meghívókód visszavonva!"})


@router.post("/partner-cegek/kod-beiranyitasa")
def kod_beiranyitasa(
    request: Request,
    kod: str = Form(...),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    if not _jogosult_e(current_user):
        return JSONResponse(status_code=403, content={"message": "Nincs jogosultságod!"})

    working_company_id = get_working_company_id(current_user, request)
    if not is_company_active(working_company_id, db):
        return JSONResponse(status_code=403, content={"message": "Ez a cég inaktív státuszú!"})
    if current_user.csak_olvasas:
        return JSONResponse(status_code=403, content={"message": "Csak megtekintési jogosultsággal rendelkezel!"})

    if pcu.tul_sok_sikertelen_probalkozas_e(db, current_user.id):
        return JSONResponse(status_code=429, content={"message": "Túl sok sikertelen próbálkozás - kérjük, várj egy órát, mielőtt újra próbálkozol!"})

    siker, hiba, masik_ceg = pcu.kod_beiranyitasa(db, kod, working_company_id, current_user.id)
    if not siker:
        db.add(models.AuditLog(
            company_id=working_company_id, user_id=current_user.id, field_name="Partner-kód beváltás sikertelen",
            old_value="-", new_value=hiba or "Ismeretlen hiba"
        ))
        db.commit()
        return JSONResponse(status_code=400, content={"message": hiba})

    db.add(models.AuditLog(
        company_id=working_company_id, user_id=current_user.id, field_name="Partnerség létrehozva",
        old_value="-", new_value=f"Partner: {masik_ceg.nev if masik_ceg else '-'}"
    ))
    db.commit()

    return JSONResponse(status_code=200, content={"message": f"Partnerség létrehozva! Innentől \"{masik_ceg.nev if masik_ceg else '-'}\" megjelenik a bérbeadás bérlő-választójában."})


@router.post("/partner-cegek/visszavonas")
def partnerseg_visszavonasa(
    request: Request,
    partnerseg_id: int = Form(...),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    if not _jogosult_e(current_user):
        return JSONResponse(status_code=403, content={"message": "Nincs jogosultságod!"})

    working_company_id = get_working_company_id(current_user, request)
    # J-09 (v65): a csak_olvasas mellé a cég-aktív ellenőrzés is kell
    tiltas = irasi_tiltas_oka(current_user, working_company_id, db)
    if tiltas:
        return JSONResponse(status_code=403, content={"message": IRASI_TILTAS_UZENETEK[tiltas]})

    siker = pcu.partnerseg_visszavonasa(db, working_company_id, partnerseg_id, current_user.id)
    if not siker:
        return JSONResponse(status_code=404, content={"message": "A partnerség nem található, vagy már vissza van vonva!"})

    db.add(models.AuditLog(
        company_id=working_company_id, user_id=current_user.id, field_name="Partnerség visszavonva",
        old_value=str(partnerseg_id), new_value="Visszavonva"
    ))
    db.commit()

    return JSONResponse(status_code=200, content={"message": "Partnerség visszavonva!"})
