from fastapi import APIRouter, Request, Depends
from fastapi.responses import HTMLResponse, RedirectResponse
from jinja2 import Environment, FileSystemLoader

from app.api.routes.auth import get_current_user, get_user_permissions
from app.models.database import get_db
from app.config import settings
from sqlalchemy.orm import Session
from fastapi import HTTPException

env = Environment(loader=FileSystemLoader("/var/www/html/metafoliadorv2/templates"))
env.globals["timezone"] = settings.timezone
router = APIRouter(tags=["views"])


def render_template(name: str, context: dict) -> HTMLResponse:
    template = env.get_template(name)
    return HTMLResponse(template.render(**context))



def check_page_permission(request: Request, perm_code: str, user=Depends(get_current_user)):
    perms = get_user_permissions(user)
    if perm_code not in perms:
        raise HTTPException(status_code=403, detail="Acceso denegado")
    return user

def get_user_context(user) -> dict:
    perms = set()
    role_all_permissions = False
    db = None
    try:
        from app.models.database import get_tenant_session
        db = get_tenant_session()
        perms = get_user_permissions(user, db)
    except: pass
    try:
        from app.models.role_permission import Role
        if not db:
            from app.models.database import get_tenant_session
            db = get_tenant_session()
        role = db.query(Role).filter(Role.name == user.role).first()
        if role:
            role_all_permissions = role.all_permissions
    except: pass
    finally:
        if db:
            try: db.close()
            except: pass
    return {"name": user.name, "email": user.email, "role": user.role, "role_all_permissions": role_all_permissions, "perms": list(perms)}


@router.get("/app/sitios/arbol", response_class=HTMLResponse, summary="Vista: cuadro de clasificación", description="Página HTML del navegador de cuadro de clasificación del sitio. Requiere permiso carpetas.view.")
async def tree_page(request: Request, user=Depends(get_current_user)):
    check_page_permission(request, "carpetas.view", user)
    return render_template("tree.html", {"request": request, "user": get_user_context(user)})

def get_customer_info(host: str) -> dict:
    from app.models.main_database import MainSessionLocal
    from app.models.main_customer import Customer

    main_domain = host.split(":")[0]
    db = MainSessionLocal()
    try:
        customer = db.query(Customer).filter(
            (Customer.subdomain + "." + settings.main_domain == main_domain)
            | (Customer.custom_domain == main_domain),
        ).first()
        if customer:
            return {
                "name": customer.name,
                "background_image": customer.background_image,
            }
        return {"name": None, "background_image": None}
    finally:
        db.close()


@router.get("/login", response_class=HTMLResponse, summary="Vista: login", description="Página de inicio de sesión. Si el usuario ya tiene sesión activa, redirige al dashboard.")
async def login_page(request: Request, db: Session = Depends(get_db)):
    from app.models.database import get_db

    host = request.headers.get("host", "").split(":")[0]
    customer_info = get_customer_info(host)

    token = request.cookies.get("access_token")
    if token:
        from app.api.routes.auth import decode_access_token
        payload = decode_access_token(token)
        if payload:
            from app.models.user import User
            user = db.query(User).filter(User.id == payload.get("user_id"), User.active == True).first()
            if user:
                return RedirectResponse(url="/app", status_code=302)
        resp = render_template("login.html", {"request": request, "customer_name": customer_info["name"], "background_image": customer_info["background_image"]})
        resp = HTMLResponse(content=resp.body if hasattr(resp, 'body') else str(resp))
        resp.delete_cookie("access_token")
        return resp

    _main_token = request.cookies.get("main_access_token")
    if _main_token:
        from app.services.main_auth_service import main_decode_access_token
        main_payload = main_decode_access_token(_main_token)
        if main_payload:
            from app.models.user import User
            main_email = main_payload.get("email", "")
            tenant_user = db.query(User).filter(User.email == main_email, User.active == True).first()
            if tenant_user:
                from app.services.auth_service import create_access_token
                tenant_token = create_access_token({
                    "user_id": tenant_user.id,
                    "email": tenant_user.email,
                    "role": tenant_user.role,
                })
                resp = RedirectResponse(url="/app", status_code=302)
                resp.set_cookie(
                    key="access_token",
                    value=tenant_token,
                    httponly=True,
                    secure=True,
                    samesite="lax",
                    max_age=28800,
                )
                return resp

    return render_template("login.html", {"request": request, "customer_name": customer_info["name"], "background_image": customer_info["background_image"]})


@router.get("/app", response_class=HTMLResponse, summary="Vista: dashboard", description="Panel principal con estadísticas, gráficos interactivos y accesos rápidos.")
async def dashboard(request: Request, user=Depends(get_current_user)):
    return render_template("dashboard.html", {
        "request": request,
        "user": get_user_context(user),
    })

@router.get("/app/jobs", response_class=HTMLResponse, summary="Vista: trabajos en cola", description="Página de monitoreo de trabajos de sincronización. Requiere permiso jobs.view.")
async def jobs_page(request: Request, user=Depends(get_current_user)):
    check_page_permission(request, "jobs.view", user)
    return render_template("jobs.html", {"request": request, "user": get_user_context(user)})

@router.get("/app/listener-logs", response_class=HTMLResponse, summary="Vista: logs del listener", description="Página de visor de logs del webhook listener. Requiere permiso listener-logs.view.")
async def listener_logs_page(request: Request, user=Depends(get_current_user)):
    check_page_permission(request, "listener-logs.view", user)
    return render_template("listener_logs.html", {"request": request, "user": get_user_context(user)})

@router.get("/app/reportes", response_class=HTMLResponse, summary="Vista: reportes", description="Página de gestión de reportes. Requiere permiso reportes.generate o reportes.toggle.")
async def reportes_page(request: Request, user=Depends(get_current_user)):
    perms = get_user_permissions(user)
    if "reportes.generate" not in perms and "reportes.toggle" not in perms:
        raise HTTPException(status_code=403, detail="Acceso denegado")
    return render_template("reportes.html", {"request": request, "user": get_user_context(user)})

@router.get("/app/roles", response_class=HTMLResponse, summary="Vista: roles y permisos", description="Página de administración RBAC. Requiere permiso roles.view.")
async def roles_page(request: Request, user=Depends(get_current_user)):
    check_page_permission(request, "roles.view", user)
    return render_template("roles.html", {"request": request, "user": get_user_context(user)})

@router.get("/app/usuarios", response_class=HTMLResponse, summary="Vista: usuarios", description="Página de gestión de usuarios del sistema. Requiere permiso usuarios.view.")
async def usuarios_page(request: Request, user=Depends(get_current_user)):
    check_page_permission(request, "usuarios.view", user)
    return render_template("usuarios.html", {"request": request, "user": get_user_context(user)})


@router.get("/app/conexiones", response_class=HTMLResponse, summary="Vista: conexiones Alfresco", description="Página de gestión de conexiones API a instancias Alfresco. Requiere permiso conexiones.view.")
async def connections_page(request: Request, user=Depends(get_current_user)):
    check_page_permission(request, "conexiones.view", user)
    return render_template("connections.html", {
        "request": request,
        "user": get_user_context(user),
    })


@router.get("/app/sitios", response_class=HTMLResponse, summary="Vista: sitios", description="Página de gestión de sitios Alfresco. Requiere permiso sitios.view.")
async def sites_page(request: Request, user=Depends(get_current_user)):
    check_page_permission(request, "sitios.view", user)
    return render_template("sites.html", {
        "request": request,
        "user": get_user_context(user),
    })


@router.get("/app/tipologias", response_class=HTMLResponse, summary="Vista: tipologías - modelos de datos", description="Página de gestión de modelos de datos personalizados de Alfresco. Requiere permiso tipologias.view.")
async def tipologias_page(request: Request, user=Depends(get_current_user)):
    check_page_permission(request, "tipologias.view", user)
    return render_template("tipologias.html", {
        "request": request,
        "user": get_user_context(user),
    })


@router.get("/app/{path:path}", response_class=HTMLResponse, summary="Vista: SPA fallback", description="Redirige cualquier ruta desconocida de /app/ al dashboard (SPA).")
async def dashboard_spa(request: Request, path: str, user=Depends(get_current_user)):
    return render_template("dashboard.html", {
        "request": request,
        "user": get_user_context(user),
    })
