import sys
sys.path.insert(0, "/var/www/html/metafoliadorv2")

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

from app.models.database import get_db
from app.models.sync_progress import SyncProgress
from app.models.alfresco_site import AlfrescoSite
from app.models.alfresco_folder import AlfrescoFolder
from app.services.timezone import iso

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


@router.get("", summary="Listar trabajos en cola", description="Lista los trabajos de sincronización registrados en SyncProgress. Filtrable por estado.")
async def list_jobs(status: str = Query(None, description="Filtrar por estado: pending, running, completed, error, cancelled"), limit: int = Query(50, description="Máximo de trabajos a retornar", ge=1, le=200), db: Session = Depends(get_db)):
    q = db.query(SyncProgress).filter(SyncProgress.site_id > 0)
    if status:
        q = q.filter(SyncProgress.status == status)
    jobs = q.order_by(desc(SyncProgress.created_at)).limit(limit).all()

    result = []
    for j in jobs:
        site_name = ""
        folder_name = ""
        if j.site_id:
            site = db.query(AlfrescoSite).filter(AlfrescoSite.id == j.site_id).first()
            if site:
                site_name = site.name
        if j.folder_id:
            folder = db.query(AlfrescoFolder).filter(AlfrescoFolder.id == j.folder_id).first()
            if folder:
                folder_name = folder.name

        result.append({
            "id": j.id,
            "site_id": j.site_id,
            "site_name": site_name,
            "folder_id": j.folder_id,
            "folder_name": folder_name,
            "task_id": j.task_id,
            "status": j.status,
            "progress": j.progress,
            "message": j.message,
            "created_at": iso(j.created_at),
            "updated_at": iso(j.updated_at),
        })
    return result


@router.post("/{job_id}/cancel", summary="Cancelar trabajo", description="Revoca una tarea Celery pendiente o en ejecución y la marca como cancelada.")
async def cancel_job(job_id: int = Path(..., description="ID del trabajo a cancelar"), db: Session = Depends(get_db)):
    job = db.query(SyncProgress).filter(SyncProgress.id == job_id).first()
    if not job:
        raise HTTPException(status_code=404, detail="Trabajo no encontrado")
    if job.status not in ("pending", "running"):
        raise HTTPException(status_code=400, detail="Solo se pueden cancelar trabajos pendientes o en ejecucion")

    from celery.result import AsyncResult
    from app.worker import celery_app
    if job.task_id:
        AsyncResult(job.task_id, app=celery_app).revoke(terminate=True)

    job.status = "cancelled"
    job.message = "Cancelado por el usuario"
    db.commit()

    return {"ok": True, "message": "Trabajo cancelado"}


@router.post("/purge", summary="Limpiar cola", description="Purga la cola de Celery y elimina todos los registros de SyncProgress pendientes o en ejecución.")
async def purge_jobs(db: Session = Depends(get_db)):
    from app.worker import celery_app
    # Purge Celery queue
    try:
        celery_app.control.purge()
    except:
        pass

    # Delete all sync_progress records that are pending or running
    db.query(SyncProgress).filter(
        SyncProgress.status.in_(["pending", "running"])
    ).delete()
    db.commit()

    return {"ok": True, "message": "Cola limpia"}
