import os
import uuid
from pathlib import Path
from dotenv import load_dotenv
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel, Field

from .adapters.comfyui import submit_comfyui_job
from .adapters.mock import create_mock_video

load_dotenv()

APP_NAME = os.getenv("APP_NAME", "OpenVideoAI")
VIDEO_ENGINE = os.getenv("VIDEO_ENGINE", "mock").lower()
OUTPUT_DIR = Path(os.getenv("OUTPUT_DIR", "outputs"))
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)

app = FastAPI(title=APP_NAME)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
app.mount("/outputs", StaticFiles(directory=str(OUTPUT_DIR)), name="outputs")

JOBS = {}

class VideoRequest(BaseModel):
    prompt: str = Field(..., min_length=5)
    negative_prompt: str = "blurry, low quality, distorted, watermark"
    duration_seconds: int = Field(5, ge=2, le=30)
    width: int = Field(768, ge=256, le=1280)
    height: int = Field(432, ge=256, le=1280)
    fps: int = Field(16, ge=8, le=30)
    seed: int | None = None

@app.get("/")
def health():
    return {"ok": True, "name": APP_NAME, "engine": VIDEO_ENGINE}

@app.post("/api/videos")
def create_video(req: VideoRequest):
    job_id = str(uuid.uuid4())
    JOBS[job_id] = {"status": "queued", "request": req.model_dump(), "video_url": None, "error": None}

    try:
        if VIDEO_ENGINE == "comfyui":
            result = submit_comfyui_job(req.model_dump(), job_id)
            JOBS[job_id].update(result)
        elif VIDEO_ENGINE == "mock":
            result = create_mock_video(req.model_dump(), job_id, OUTPUT_DIR)
            JOBS[job_id].update(result)
        else:
            raise ValueError(f"Unknown VIDEO_ENGINE: {VIDEO_ENGINE}")
    except Exception as exc:
        JOBS[job_id]["status"] = "failed"
        JOBS[job_id]["error"] = str(exc)
        raise HTTPException(status_code=500, detail=str(exc))

    return {"job_id": job_id, **JOBS[job_id]}

@app.get("/api/videos/{job_id}")
def get_video(job_id: str):
    if job_id not in JOBS:
        raise HTTPException(status_code=404, detail="Job not found")
    return {"job_id": job_id, **JOBS[job_id]}
