"""Endpoints de operación y observabilidad del carril CRM -> EFC.

Tablero mínimo para ver y reintentar la entrega de expedientes y documentos a EFC. Autenticado con
el auth normal del CRM y acotado por tenant/company, como el resto del módulo.
Montado bajo ``/v1/crm`` → ``/v1/crm/expediente-gateway/...``
"""
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session

from core.database import get_core_db
from core.security import get_current_user

from . import service

router = APIRouter(prefix="/expediente-gateway", tags=["EFC Gateway (ops)"])


@router.get("/outbox")
def list_outbox(
    company_id: int = Query(..., description="Company ID"),
    tipo: str | None = Query(None, description="Filtrar por tabla: sync|file"),
    status: str | None = Query(None, description="Filtrar por status: pending|sent|failed"),
    limit: int = Query(100, ge=1, le=500),
    current_user: dict = Depends(get_current_user),
    db: Session = Depends(get_core_db),
):
    """Filas de los dos outbox, para ver los fallos y su ``last_error``."""
    return service.list_outbox(db, current_user["tenant_id"], company_id, tipo, status, limit)


@router.post("/outbox/{outbox_id}/retry")
def retry_outbox(
    outbox_id: int,
    company_id: int = Query(..., description="Company ID"),
    tipo: str = Query("file", description="Tabla de la fila: sync|file"),
    current_user: dict = Depends(get_current_user),
    db: Session = Depends(get_core_db),
):
    """Reintento manual de una fila: la resetea a ``pending`` y la re-despacha.

    Una fila inexistente devuelve **404 con mensaje específico**, no un 200 silencioso: el frontend
    pinta el botón de reintento según lo que reciba, y un 200 le haría creer que la entrega volvió a
    la cola cuando no hay nada que entregar.
    """
    ok = service.retry_outbox_row(db, outbox_id, current_user["tenant_id"], company_id, tipo)
    if not ok:
        raise HTTPException(status_code=404, detail="Fila de outbox no encontrada")
    return {"status": "requeued", "id": outbox_id}


@router.get("/metrics")
def metrics(
    company_id: int = Query(..., description="Company ID"),
    current_user: dict = Depends(get_current_user),
    db: Session = Depends(get_core_db),
):
    """Conteo de los dos outbox por status (pending/sent/failed) para monitoreo."""
    return service.outbox_metrics(db, current_user["tenant_id"], company_id)
