"""
Measurement unit catalog endpoints.

Shared org-wide list of units used by test parameters. Custom units created
here are immediately available in every analyte unit picker.
"""

from typing import Annotated
from uuid import UUID

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

from app.core.auth_deps import require_permission
from app.core.dependencies import get_db
from app.core.permissions import PermissionCode
from app.core.responses import SuccessResponse
from app.schemas.unit import UnitCreate, UnitResponse, UnitUpdate
from app.services.unit_service import UnitService

router = APIRouter(tags=["Units"])
_service = UnitService()


@router.get(
    "/units",
    response_model=SuccessResponse[list[UnitResponse]],
    status_code=status.HTTP_200_OK,
    summary="List measurement units",
    description="Retrieve the shared unit catalog (active units by default).",
    dependencies=[Depends(require_permission(PermissionCode.TEST_READ))],
)
async def list_units(
    db: Annotated[AsyncSession, Depends(get_db)],
    active_only: bool = Query(True, description="Hide deactivated units"),
) -> SuccessResponse[list[UnitResponse]]:
    units = await _service.list_units(db, active_only=active_only)
    return SuccessResponse(data=units)


@router.post(
    "/units",
    response_model=SuccessResponse[UnitResponse],
    status_code=status.HTTP_201_CREATED,
    summary="Create measurement unit",
    description="Add a custom unit. Immediately available in analyte unit pickers.",
    dependencies=[Depends(require_permission(PermissionCode.TEST_WRITE))],
)
async def create_unit(
    data: UnitCreate,
    db: Annotated[AsyncSession, Depends(get_db)],
) -> SuccessResponse[UnitResponse]:
    unit = await _service.create_unit(db, data)
    return SuccessResponse(data=unit, message="Unit created successfully.")


@router.patch(
    "/units/{unit_id}",
    response_model=SuccessResponse[UnitResponse],
    status_code=status.HTTP_200_OK,
    summary="Update measurement unit",
    description="Rename or (de)activate a unit.",
    dependencies=[Depends(require_permission(PermissionCode.TEST_WRITE))],
)
async def update_unit(
    unit_id: UUID,
    data: UnitUpdate,
    db: Annotated[AsyncSession, Depends(get_db)],
) -> SuccessResponse[UnitResponse]:
    unit = await _service.update_unit(db, unit_id, data)
    return SuccessResponse(data=unit, message="Unit updated successfully.")


@router.delete(
    "/units/{unit_id}",
    response_model=SuccessResponse[dict[str, str]],
    status_code=status.HTTP_200_OK,
    summary="Delete measurement unit",
    description="Hard delete a custom unit. System units are protected (deactivate instead).",
    dependencies=[Depends(require_permission(PermissionCode.TEST_WRITE))],
)
async def delete_unit(
    unit_id: UUID,
    db: Annotated[AsyncSession, Depends(get_db)],
) -> SuccessResponse[dict[str, str]]:
    await _service.delete_unit(db, unit_id)
    return SuccessResponse(data={"id": str(unit_id)}, message="Unit deleted successfully.")
