from fastapi import APIRouter, Depends, HTTPException
from fastapi.responses import PlainTextResponse
from sqlalchemy.orm import Session, joinedload

from app.api.deps import get_current_user
from app.core.database import get_db
from app.models import Application, Job, User
from app.services.wow_tier_d import (
    attach_signals_to_jobs,
    followup_ics,
    job_signals,
    mission_today,
    signal_gates,
    silence_protocol,
    twin_counts,
    twin_siblings,
)

router = APIRouter(tags=["tier-d"])


@router.get("/intelligence/mission")
def mission(user: User = Depends(get_current_user), db: Session = Depends(get_db)):
    return mission_today(db, user)


@router.get("/intelligence/jobs/{job_id}/truth")
def job_truth(job_id: int, user: User = Depends(get_current_user), db: Session = Depends(get_db)):
    job = db.get(Job, job_id)
    if not job:
        raise HTTPException(404, "Oferta no encontrada")
    gates = signal_gates(db, user)
    count = twin_counts(db, [job]).get(job.id, 1)
    siblings = twin_siblings(db, job) if gates.get("twins") else []
    return job_signals(job, gates=gates, twin_count=count, twins=siblings)


@router.get("/intelligence/applications/{app_id}/silence")
def application_silence(
    app_id: int, user: User = Depends(get_current_user), db: Session = Depends(get_db)
):
    app = (
        db.query(Application)
        .options(joinedload(Application.job))
        .filter(Application.id == app_id, Application.user_id == user.id)
        .first()
    )
    if not app:
        raise HTTPException(404, "Candidatura no encontrada")
    return silence_protocol(app, gates=signal_gates(db, user))


@router.get("/intelligence/applications/{app_id}/followup.ics")
def application_followup_ics(
    app_id: int, user: User = Depends(get_current_user), db: Session = Depends(get_db)
):
    app = (
        db.query(Application)
        .options(joinedload(Application.job))
        .filter(Application.id == app_id, Application.user_id == user.id)
        .first()
    )
    if not app:
        raise HTTPException(404, "Candidatura no encontrada")
    gates = signal_gates(db, user)
    if not gates.get("ics"):
        raise HTTPException(403, "El calendario de seguimiento va con Carrera Max.")
    proto = silence_protocol(app, gates=gates)
    step = proto.get("next")
    if not step:
        raise HTTPException(400, "No hay un seguimiento pendiente.")
    body = followup_ics(app, step)
    return PlainTextResponse(
        body,
        media_type="text/calendar",
        headers={"Content-Disposition": f'attachment; filename="seguimiento-{app_id}.ics"'},
    )
