from fastapi import APIRouter, Request, Depends, UploadFile, File
from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse
from sqlalchemy.orm import Session

import models
from security import EMELOGEP_KEZELO_SZEREPKOROK
from database import get_db
from security import (
    is_safe_extension, get_current_user, get_working_company_id, is_company_active, require_modul,
    ai_szkenneles_rate_limitalva_e,
)
from ai_scan_utils import elemzi_adattabla_kepet, AiElemzesHiba
from image_utils import tomorit_kepet
from templates_env import templates
from hibakodok import hiba_uzenet

router = APIRouter(dependencies=[Depends(require_modul("EMELOGEP"))])


def ai_szkenneles_engedelyezve(company_id: int, db: Session) -> bool:
    """Cégenként kapcsolható, fizetős extra funkció - az Admin engedélyezi cégenként."""
    beallitas = db.query(models.Dictionary).filter(
        models.Dictionary.company_id == company_id,
        models.Dictionary.kategoria == "AiSzkennelesEngedelyezve"
    ).first()
    return bool(beallitas and beallitas.ertek == "True")


@router.get("/gep-ai-beolvasas", response_class=HTMLResponse)
def gep_ai_beolvasas_oldal(
    request: Request,
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    if current_user.role not in EMELOGEP_KEZELO_SZEREPKOROK:      # J-25 (v76): pozitív lista
        return RedirectResponse(url="/lista")

    working_company_id = get_working_company_id(current_user, request)

    if not ai_szkenneles_engedelyezve(working_company_id, db):
        return RedirectResponse(url="/lista")

    if not is_company_active(working_company_id, db):
        return RedirectResponse(url="/lista?inaktiv_ceg=1")

    if current_user.csak_olvasas:
        return RedirectResponse(url="/lista?csak_olvasas=1")

    return templates.TemplateResponse(
        request=request,
        name="gep-ai-beolvasas.html",
        context={"user": current_user}
    )


@router.post("/gep-ai-beolvasas/elemzes")
async def gep_ai_beolvasas_elemzes(
    request: Request,
    file: UploadFile = File(...),
    db: Session = Depends(get_db),
    current_user: models.User = Depends(get_current_user)
):
    if current_user.role not in EMELOGEP_KEZELO_SZEREPKOROK:      # J-25 (v76): pozitív lista
        return JSONResponse(status_code=403, content={"message": "Nincs jogosultságod!"})

    working_company_id = get_working_company_id(current_user, request)

    if not ai_szkenneles_engedelyezve(working_company_id, db):
        return JSONResponse(status_code=403, content={"message": "Az AI szkennelés nincs engedélyezve ehhez a céghez!"})

    if not is_company_active(working_company_id, db):
        return JSONResponse(status_code=403, content={"message": "Ez a cég inaktív státuszú, szerkesztés nem lehetséges!"})

    if current_user.csak_olvasas:
        return JSONResponse(status_code=403, content={"message": "Csak megtekintési jogosultsággal rendelkezel, szerkesztés nem lehetséges!"})

    if ai_szkenneles_rate_limitalva_e(current_user.id):
        return JSONResponse(status_code=429, content={"message": "Túl sok AI-szkennelési kérés rövid idő alatt - kérjük, próbáld újra néhány perc múlva!"})

    if not is_safe_extension(file.filename) or not (file.filename or "").lower().endswith((".jpg", ".jpeg", ".png")):
        return JSONResponse(status_code=400, content={"message": "Nem engedélyezett fájlformátum! Csak kép (JPG/PNG) tölthető fel."})

    kep_bytes = tomorit_kepet(await file.read())
    if kep_bytes is None:
        return JSONResponse(status_code=400, content={"message": "A feltöltött fájl nem érvényes kép!"})

    try:
        eredmeny = elemzi_adattabla_kepet(kep_bytes, "image/jpeg")
    except AiElemzesHiba as e:
        # Az AiElemzesHiba szövege már eleve kliensnek szánt, generikus üzenet (l.
        # ai_scan_utils.py) - ide a hibakodok.py mintáját követve csak a hibakódot fűzzük hozzá.
        return JSONResponse(status_code=502, content={"message": hiba_uzenet(str(e), "E-AI-01")})

    return JSONResponse(status_code=200, content=eredmeny)
