from uuid import UUID

from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession

from src.apps.plots.schemas.plot_status import (
    CreatePlotStatusRequest,
    PlotStatusResponse,
    UpdatePlotStatusRequest,
)
from src.apps.plots.services.plot_status_service import PlotStatusService
from src.core.constants import UserRole
from src.core.dependencies import require_min_role, require_roles
from src.core.schemas.response import success
from src.database.session import get_db

router = APIRouter(prefix="/plot-statuses", tags=["Plot Statuses"])


@router.get("", response_model=dict)
async def list_plot_statuses(
    current_user=Depends(require_min_role(UserRole.VIEW_ONLY)),
    db: AsyncSession = Depends(get_db),
):
    """Tenant status catalog (seeded with the 4 defaults on first access) — AC-06/AC-17."""
    service = PlotStatusService(db)
    statuses = await service.list_or_seed(current_user.tenant_id)
    return success(
        data=[PlotStatusResponse.model_validate(s).model_dump() for s in statuses]
    )


@router.post("", response_model=dict, status_code=201)
async def create_plot_status(
    body: CreatePlotStatusRequest,
    current_user=Depends(require_roles(UserRole.ADMINISTRATOR)),
    db: AsyncSession = Depends(get_db),
):
    """Create a custom status (Administrator only)."""
    service = PlotStatusService(db)
    status = await service.create(current_user.tenant_id, body.model_dump())
    return success(
        data=PlotStatusResponse.model_validate(status).model_dump(),
        message="Status created",
    )


@router.patch("/{status_id}", response_model=dict)
async def update_plot_status(
    status_id: UUID,
    body: UpdatePlotStatusRequest,
    current_user=Depends(require_roles(UserRole.ADMINISTRATOR)),
    db: AsyncSession = Depends(get_db),
):
    """Rename / recolor a status (Administrator only)."""
    service = PlotStatusService(db)
    status = await service.update(
        status_id, current_user.tenant_id, body.model_dump(exclude_unset=True)
    )
    return success(
        data=PlotStatusResponse.model_validate(status).model_dump(),
        message="Status updated",
    )


@router.delete("/{status_id}", status_code=204)
async def delete_plot_status(
    status_id: UUID,
    current_user=Depends(require_roles(UserRole.ADMINISTRATOR)),
    db: AsyncSession = Depends(get_db),
):
    """Delete a status (Administrator only); blocked (409) while referenced by a plot."""
    service = PlotStatusService(db)
    await service.delete(status_id, current_user.tenant_id)
