from datetime import datetime
from typing import List, Optional

from fastapi import APIRouter, Depends, HTTPException
from sqlmodel import Session, select

from app.db import get_session
from app.models import SavedProject
from app.schemas import SavedProjectCreate, SavedProjectRead, SavedProjectUpdate

router = APIRouter(prefix="/projects", tags=["projects"])


@router.post("", response_model=SavedProjectRead)
def create_saved_project(payload: SavedProjectCreate, session: Session = Depends(get_session)):
    existing = session.exec(select(SavedProject).where(SavedProject.public_id == payload.public_id)).first()
    if existing:
        raise HTTPException(status_code=409, detail="public_id déjà existant")
    project = SavedProject(**payload.dict())
    session.add(project)
    session.commit()
    session.refresh(project)
    return project


@router.get("", response_model=List[SavedProjectRead])
def list_saved_projects(status: Optional[str] = None, postal_code: Optional[str] = None, work_type: Optional[str] = None, session: Session = Depends(get_session)):
    query = select(SavedProject)
    if status:
        query = query.where(SavedProject.status == status)
    if postal_code:
        query = query.where(SavedProject.postal_code == postal_code)
    if work_type:
        query = query.where(SavedProject.work_type == work_type)
    return session.exec(query.order_by(SavedProject.updated_at.desc())).all()


@router.get("/{public_id}", response_model=SavedProjectRead)
def get_saved_project(public_id: str, session: Session = Depends(get_session)):
    project = session.exec(select(SavedProject).where(SavedProject.public_id == public_id)).first()
    if not project:
        raise HTTPException(status_code=404, detail="Projet introuvable")
    return project


@router.patch("/{public_id}", response_model=SavedProjectRead)
def update_saved_project(public_id: str, payload: SavedProjectUpdate, session: Session = Depends(get_session)):
    project = session.exec(select(SavedProject).where(SavedProject.public_id == public_id)).first()
    if not project:
        raise HTTPException(status_code=404, detail="Projet introuvable")
    for key, value in payload.dict(exclude_unset=True).items():
        setattr(project, key, value)
    project.updated_at = datetime.utcnow()
    session.add(project)
    session.commit()
    session.refresh(project)
    return project
