from fastapi import APIRouter, Depends, File, Form, Request, UploadFile
from fastapi.responses import RedirectResponse
from fastapi.templating import Jinja2Templates
from sqlalchemy.orm import Session

from ..auth import authenticate_user, get_current_user, get_db, get_current_user_optional
from ..services import UserService

router = APIRouter()

templates = Jinja2Templates(directory="app/templates")


@router.get("/login")
def login_page(request: Request, db: Session = Depends(get_db)):
    user = get_current_user_optional(request, db)
    if user:
        return RedirectResponse("/projects", status_code=302)
    return templates.TemplateResponse("login.html", {"request": request, "error": None})


@router.post("/login")
def login(request: Request, username: str = Form(...), password: str = Form(...), db: Session = Depends(get_db)):
    user = authenticate_user(db, username, password)
    if not user:
        return templates.TemplateResponse(
            "login.html", {"request": request, "error": "Credenciales invalidas"}, status_code=401
        )
    request.session["user_id"] = user.id
    return RedirectResponse("/projects", status_code=302)


@router.post("/logout")
def logout(request: Request):
    request.session.clear()
    return RedirectResponse("/login", status_code=302)


@router.post("/account/password")
def change_password(
    request: Request,
    current_password: str = Form(...),
    new_password: str = Form(...),
    confirm_password: str = Form(...),
    db: Session = Depends(get_db),
):
    user = get_current_user(request, db)
    service = UserService(db)
    try:
        service.change_password(user, current_password, new_password, confirm_password)
    except ValueError as exc:
        error_code = exc.args[0] if exc.args else "unknown"
        return RedirectResponse(f"/projects?password_error={error_code}", status_code=302)
    return RedirectResponse("/projects?password_status=updated", status_code=302)


@router.post("/account/profile-photo")
def update_profile_photo(
    request: Request,
    profile_photo: UploadFile | None = File(None),
    remove_photo: str = Form("false"),
    db: Session = Depends(get_db),
):
    user = get_current_user(request, db)
    service = UserService(db)
    try:
        service.update_profile_photo(user, profile_photo, remove_photo == "true")
    except ValueError as exc:
        error_code = exc.args[0] if exc.args else "unknown"
        return RedirectResponse(f"/projects?profile_error={error_code}", status_code=302)
    return RedirectResponse("/projects?profile_status=updated", status_code=302)
