"""Routes du module Sites (spec 2026-08-31 §5).

Toutes passent par `CurrentOrgDep` : sans organisation active, la dépendance répond 404
avant d'atteindre le handler. Aucun handler ne lit d'`org_id` dans le corps de requête.
"""

import uuid
from typing import Annotated

from fastapi import APIRouter, Query

from app.core.auth import CurrentOrgDep
from app.core.errors import AppError
from app.db.engine import SessionDep
from app.sites import service
from app.sites.domain import DomainError, normalize_domain
from app.sites.preflight import PreflightReport, run_preflight
from app.sites.schemas import (
    PreflightIn,
    SiteCreate,
    SiteListOut,
    SiteOut,
    SiteUpdate,
    TargetCreate,
    TargetOut,
    TargetUpdate,
)

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


@router.post("", status_code=201)
async def create_site(user: CurrentOrgDep, session: SessionDep, payload: SiteCreate) -> SiteOut:
    return SiteOut.model_validate(await service.create_site(session, user.org_id, payload))


@router.post("/preflight")
async def preflight(user: CurrentOrgDep, payload: PreflightIn) -> PreflightReport:
    # Lecture seule, sans persistance : rien n'est écrit tant que le site n'est pas créé.
    try:
        host = normalize_domain(payload.domain)
    except DomainError as exc:
        raise AppError(422, "Validation error", str(exc)) from exc
    return await run_preflight(host)


@router.get("")
async def list_sites(
    user: CurrentOrgDep,
    session: SessionDep,
    cursor: str | None = None,
    limit: Annotated[int, Query(ge=1, le=100)] = 25,
) -> SiteListOut:
    sites, next_cursor = await service.list_sites(session, user.org_id, cursor=cursor, limit=limit)
    return SiteListOut(
        items=[SiteOut.model_validate(site) for site in sites], next_cursor=next_cursor
    )


@router.get("/{site_id}")
async def get_site(user: CurrentOrgDep, session: SessionDep, site_id: uuid.UUID) -> SiteOut:
    return SiteOut.model_validate(await service.get_site(session, user.org_id, site_id))


@router.patch("/{site_id}")
async def rename_site(
    user: CurrentOrgDep, session: SessionDep, site_id: uuid.UUID, payload: SiteUpdate
) -> SiteOut:
    return SiteOut.model_validate(await service.rename_site(session, user.org_id, site_id, payload))


@router.delete("/{site_id}", status_code=204)
async def delete_site(user: CurrentOrgDep, session: SessionDep, site_id: uuid.UUID) -> None:
    await service.delete_site(session, user.org_id, site_id)


@router.post("/{site_id}/targets", status_code=201)
async def add_target(
    user: CurrentOrgDep, session: SessionDep, site_id: uuid.UUID, payload: TargetCreate
) -> TargetOut:
    return TargetOut.model_validate(
        await service.add_target(session, user.org_id, site_id, payload)
    )


@router.patch("/{site_id}/targets/{target_id}")
async def promote_target(
    user: CurrentOrgDep,
    session: SessionDep,
    site_id: uuid.UUID,
    target_id: uuid.UUID,
    _payload: TargetUpdate,
) -> TargetOut:
    return TargetOut.model_validate(
        await service.promote_target(session, user.org_id, site_id, target_id)
    )


@router.delete("/{site_id}/targets/{target_id}", status_code=204)
async def delete_target(
    user: CurrentOrgDep,
    session: SessionDep,
    site_id: uuid.UUID,
    target_id: uuid.UUID,
) -> None:
    await service.delete_target(session, user.org_id, site_id, target_id)
