from dataclasses import asdict

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

from api.database import get_session
from api.schemas.identifier_migration import (
    SealedProjectionRepairReceiptRead,
    SealedProjectionRepairSubmit,
)
from api.services.work_record_identifier_migration import (
    IdentifierMigrationError,
    repair_absent_prederivation_projection,
)

router = APIRouter(prefix="/identifier-migrations", tags=["identifier-migrations"])


@router.post(
    "/sealed-projection-repairs",
    response_model=SealedProjectionRepairReceiptRead,
)
async def repair_sealed_projection(
    body: SealedProjectionRepairSubmit,
    session: AsyncSession = Depends(get_session),
) -> dict:
    """Restore one exact pre-derivation workplan unit into an absent projection."""
    try:
        receipt = await repair_absent_prederivation_projection(
            session,
            body.plan,
            body.repo_slug,
            body.unit,
            expected_plan_sha256=body.expected_plan_sha256,
            source_revision=body.source_revision,
            source_fingerprint=body.source_fingerprint,
            source_clean=body.source_clean,
            source_synchronized=body.source_synchronized,
            primary_confirmed=body.primary_confirmed,
            projection_identity=body.projection_identity,
        )
    except IdentifierMigrationError as exc:
        raise HTTPException(status_code=409, detail=str(exc)) from exc
    return asdict(receipt)
