from pydantic import BaseModel
from fastapi import APIRouter, Depends, Header
from sqlmodel import Session

from app.db.session import get_session
from app.services.tasks import complete_task, undo_task

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


class TaskMutationRequest(BaseModel):
    idempotency_key: str | None = None


def _resolve_key(body: TaskMutationRequest | None, header_key: str | None) -> str | None:
    return header_key or (body.idempotency_key if body else None)


@router.post("/{task_id}/complete")
def complete(
    task_id: int,
    body: TaskMutationRequest | None = None,
    idempotency_key: str | None = Header(default=None, alias="Idempotency-Key"),
    session: Session = Depends(get_session),
) -> dict:
    return complete_task(session, task_id, _resolve_key(body, idempotency_key))


@router.post("/{task_id}/undo")
def undo(
    task_id: int,
    body: TaskMutationRequest | None = None,
    idempotency_key: str | None = Header(default=None, alias="Idempotency-Key"),
    session: Session = Depends(get_session),
) -> dict:
    return undo_task(session, task_id, _resolve_key(body, idempotency_key))
