"""Dashboard-facing job status proxy — forwards to Cloud gateway."""
from __future__ import annotations

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession

from src.core.database import get_db
from src.core.dependencies import require_active_billing_for_project_id
from src.domain.auth.models import User
from src.domain.auth.router import get_current_user
from src.domain.projects.repository import ProjectRepository
from src.integrations.cloud_control_client import get_cloud_client_for_workspace

import httpx
from uuid import UUID

router = APIRouter(prefix="/api/projects/{project_id}/jobs", tags=["jobs"])


@router.get("/{job_id}")
async def get_job_status(
    job_id: str,
    project_id: UUID = Depends(require_active_billing_for_project_id),
    _: User = Depends(get_current_user),
    db: AsyncSession = Depends(get_db),
) -> dict:
    """Proxy Cloud job status to the dashboard. Scoped to project for access control."""
    project = await ProjectRepository(db).get_by_id(project_id)
    if not project:
        raise HTTPException(status_code=404, detail="Project not found")

    cloud_client = await get_cloud_client_for_workspace(project.workspace_id, db)
    if not cloud_client._is_configured():
        raise HTTPException(status_code=503, detail="Cloud not configured")

    try:
        data = await cloud_client._get(f"/v1/cloud/requests/{job_id}")
        return data
    except httpx.HTTPStatusError as exc:
        if exc.response.status_code == 404:
            raise HTTPException(status_code=404, detail="Job not found")
        raise HTTPException(status_code=502, detail=f"Cloud error {exc.response.status_code}")
    except Exception:
        raise HTTPException(status_code=502, detail="Cloud unavailable")


@router.get("/{job_id}/result")
async def get_job_result(
    job_id: str,
    project_id: UUID = Depends(require_active_billing_for_project_id),
    _: User = Depends(get_current_user),
    db: AsyncSession = Depends(get_db),
) -> dict:
    """Proxy Cloud job result payload (R2) after terminal status."""
    project = await ProjectRepository(db).get_by_id(project_id)
    if not project:
        raise HTTPException(status_code=404, detail="Project not found")

    cloud_client = await get_cloud_client_for_workspace(project.workspace_id, db)
    if not cloud_client._is_configured():
        raise HTTPException(status_code=503, detail="Cloud not configured")

    try:
        return await cloud_client._get(f"/v1/cloud/requests/{job_id}/result")
    except httpx.HTTPStatusError as exc:
        if exc.response.status_code == 404:
            raise HTTPException(status_code=404, detail="Job not found")
        if exc.response.status_code == 409:
            raise HTTPException(status_code=409, detail="Job not finished")
        raise HTTPException(status_code=502, detail=f"Cloud error {exc.response.status_code}")
    except Exception:
        raise HTTPException(status_code=502, detail="Cloud unavailable")


@router.post("/{job_id}/cancel")
async def cancel_job(
    job_id: str,
    project_id: UUID = Depends(require_active_billing_for_project_id),
    _: User = Depends(get_current_user),
    db: AsyncSession = Depends(get_db),
) -> dict:
    """Mark a stuck queued/processing Cloud job as failed (user cancel)."""
    project = await ProjectRepository(db).get_by_id(project_id)
    if not project:
        raise HTTPException(status_code=404, detail="Project not found")

    cloud_client = await get_cloud_client_for_workspace(project.workspace_id, db)
    if not cloud_client._is_configured():
        raise HTTPException(status_code=503, detail="Cloud not configured")

    try:
        return await cloud_client._post(f"/v1/cloud/requests/{job_id}/cancel", {})
    except httpx.HTTPStatusError as exc:
        if exc.response.status_code == 404:
            raise HTTPException(status_code=404, detail="Job not found")
        raise HTTPException(status_code=502, detail=f"Cloud error {exc.response.status_code}")
    except Exception:
        raise HTTPException(status_code=502, detail="Cloud unavailable")
