"""API проектов M1."""

from fastapi import APIRouter, HTTPException
from sqlalchemy import select

from app.dependencies import DbDep, UserDep
from app.models import Project
from app.schemas import ProjectCreate, ProjectOut, ProjectUpdate

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

VALID_RELEVANCE = {"active", "paused", "archived"}


@router.post("", response_model=ProjectOut)
async def create_project(schema: ProjectCreate, db: DbDep, user: UserDep) -> Project:
    exists = db.scalars(select(Project).where(Project.name == schema.name)).first()
    if exists is not None:
        raise HTTPException(status_code=409, detail="Project name already exists")
    project = Project(name=schema.name, priority=schema.priority, note=schema.note)
    db.add(project)
    db.flush()
    return project


@router.get("", response_model=list[ProjectOut])
async def list_projects(db: DbDep, user: UserDep) -> list[Project]:
    return list(db.scalars(select(Project).order_by(Project.id)).all())


@router.get("/{project_id}", response_model=ProjectOut)
async def get_project(project_id: int, db: DbDep, user: UserDep) -> Project:
    project = db.get(Project, project_id)
    if project is None:
        raise HTTPException(status_code=404, detail="Project not found")
    return project


@router.patch("/{project_id}", response_model=ProjectOut)
async def update_project(
    project_id: int, schema: ProjectUpdate, db: DbDep, user: UserDep
) -> Project:
    project = db.get(Project, project_id)
    if project is None:
        raise HTTPException(status_code=404, detail="Project not found")
    data = schema.model_dump(exclude_unset=True)
    if "relevance_status" in data and data["relevance_status"] not in VALID_RELEVANCE:
        raise HTTPException(
            status_code=422, detail=f"Unknown relevance_status: {data['relevance_status']}"
        )
    for field, value in data.items():
        setattr(project, field, value)
    return project


@router.delete("/{project_id}")
async def delete_project(project_id: int, db: DbDep) -> dict[str, bool]:
    project = db.get(Project, project_id)
    if project is None:
        raise HTTPException(status_code=404, detail="Project not found")
    db.delete(project)
    return {"ok": True}
