from fastapi import FastAPI, Depends, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from contextlib import asynccontextmanager
import os
from sqlmodel import Session, select, func
from datetime import datetime

from database import create_db_and_tables, get_session
from routers import resumes, auth
from models import Resume, User

@asynccontextmanager
async def lifespan(app: FastAPI):
    create_db_and_tables()
    yield

app = FastAPI(lifespan=lifespan)
templates = Jinja2Templates(directory="templates")

app.mount("/static", StaticFiles(directory="static"), name="static")
app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")

app.include_router(resumes.router)
app.include_router(auth.router)

@app.get("/", response_class=RedirectResponse)
async def read_root():
    return RedirectResponse(url="/login")

@app.get("/login", response_class=HTMLResponse)
async def login_page(request: Request):
    return templates.TemplateResponse("login.html", {"request": request})

@app.get("/dashboard", response_class=RedirectResponse)
async def dashboard_page():
    return RedirectResponse(url="/dashboard/parser")

async def get_dashboard_context(request: Request, session: Session):
    # Fetch common stats for admin (if needed by frontend)
    total_resumes = session.exec(select(func.count(Resume.id))).one()
    total_users = session.exec(select(func.count(User.id))).one()
    admin_users = session.exec(select(func.count(User.id)).where(User.is_admin == True)).one()
    active_users = session.exec(select(func.count(User.id)).where(User.is_active == True)).one()
    
    # Recent items
    recent_resumes = session.exec(select(Resume).order_by(Resume.created_at.desc()).limit(5)).all()
    recent_users = session.exec(select(User).order_by(User.created_at.desc()).limit(10)).all()

    return {
        "request": request,
        "stats": {
            "total_resumes": total_resumes,
            "total_users": total_users,
            "admin_users": admin_users,
            "active_users": active_users
        },
        "recent_resumes": recent_resumes,
        "recent_users": recent_users
    }

@app.get("/dashboard/parser", response_class=HTMLResponse)
async def dashboard_parser(request: Request, session: Session = Depends(get_session)):
    ctx = await get_dashboard_context(request, session)
    return templates.TemplateResponse("dashboard.html", ctx)

@app.get("/dashboard/intelligence", response_class=HTMLResponse)
async def dashboard_intelligence(request: Request, session: Session = Depends(get_session)):
    ctx = await get_dashboard_context(request, session)
    return templates.TemplateResponse("dashboard.html", ctx)

@app.get("/dashboard/users", response_class=HTMLResponse)
async def dashboard_users(request: Request, session: Session = Depends(get_session)):
    ctx = await get_dashboard_context(request, session)
    return templates.TemplateResponse("dashboard.html", ctx)

@app.get("/dashboard/password", response_class=HTMLResponse)
async def dashboard_password(request: Request, session: Session = Depends(get_session)):
    ctx = await get_dashboard_context(request, session)
    return templates.TemplateResponse("dashboard.html", ctx)

@app.get("/dashboard/account", response_class=HTMLResponse)
async def dashboard_account(request: Request, session: Session = Depends(get_session)):
    ctx = await get_dashboard_context(request, session)
    return templates.TemplateResponse("dashboard.html", ctx)

@app.get("/dashboard/admin", response_class=HTMLResponse)
async def admin_dashboard(request: Request, session: Session = Depends(get_session)):
    # The user wants the admin dashboard IN the dashboard.
    # We serve the main dashboard template which has the roles and SPA sections.
    ctx = await get_dashboard_context(request, session)
    return templates.TemplateResponse("dashboard.html", ctx)

@app.get("/dashboard/resume/{resume_id}", response_class=HTMLResponse)
async def resume_detail_page(request: Request):
    return templates.TemplateResponse("resume_detail.html", {"request": request})
