from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session

from .. import models, schemas
from ..auth import admin_gate
from ..database import get_db

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


@router.get("", response_model=list[schemas.SignalOut])
def list_signals(
    status: str | None = Query(None, pattern="^(approved|rejected)$"),
    limit: int = Query(50, le=200),
    db: Session = Depends(get_db),
):
    q = db.query(models.Signal).order_by(models.Signal.created_at.desc(), models.Signal.id.desc())
    if status:
        q = q.filter(models.Signal.status == status)
    return q.limit(limit).all()


@router.get("/{signal_id}", response_model=schemas.SignalOut)
def get_signal(signal_id: int, db: Session = Depends(get_db)):
    signal = db.get(models.Signal, signal_id)
    if not signal:
        raise HTTPException(404, "Signal not found")
    return signal


@router.delete("/history")
def clear_history(db: Session = Depends(get_db), _admin=Depends(admin_gate)):
    """Clear signal history. Signals attached to paper trades are KEPT —
    they feed the AI learning loop (probability calibration)."""
    traded_ids = [
        row[0]
        for row in db.query(models.PaperTrade.signal_id)
        .filter(models.PaperTrade.signal_id.isnot(None))
        .distinct()
        .all()
    ]
    q = db.query(models.Signal)
    if traded_ids:
        q = q.filter(models.Signal.id.notin_(traded_ids))
    deleted = q.delete(synchronize_session=False)
    # Detach kept signals from scan runs, then clear the runs
    db.query(models.Signal).update({models.Signal.scan_run_id: None}, synchronize_session=False)
    runs_deleted = db.query(models.ScanRun).delete(synchronize_session=False)
    db.commit()
    return {"signals_deleted": deleted, "scan_runs_deleted": runs_deleted,
            "signals_kept_for_learning": len(traded_ids)}
