import uuid

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session

from app.api.deps import get_current_principal, require_role
from app.api.v1.auth import _slugify
from app.db.session import get_db
from app.models.org import Project, User, UserRole
from app.schemas.project import ProjectCreate, ProjectOut
from app.services.audit import record_audit

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


@router.get("", response_model=list[ProjectOut])
def list_projects(db: Session = Depends(get_db), current_user: User = Depends(get_current_principal)):
    return db.query(Project).filter(Project.org_id == current_user.org_id).order_by(Project.created_at.desc()).all()


@router.post("", response_model=ProjectOut, status_code=201)
def create_project(
    payload: ProjectCreate,
    db: Session = Depends(get_db),
    current_user: User = Depends(require_role(UserRole.editor)),
):
    project = Project(
        org_id=current_user.org_id,
        owner_id=current_user.id,
        name=payload.name,
        slug=_slugify(payload.name),
        description=payload.description,
        domain=payload.domain,
        taxonomy=payload.taxonomy or [],
    )
    db.add(project)
    db.commit()
    db.refresh(project)
    record_audit(db, current_user, "project.create", "project", project.id, {"name": project.name})
    return project


@router.get("/{project_id}", response_model=ProjectOut)
def get_project(
    project_id: uuid.UUID, db: Session = Depends(get_db), current_user: User = Depends(get_current_principal)
):
    project = db.get(Project, project_id)
    if project is None or project.org_id != current_user.org_id:
        raise HTTPException(status_code=404, detail="Project not found")
    return project
