"""
routes/setup.py — Interview Setup
POST /api/setup/photo     — upload candidate photo
POST /api/setup/complete  — mark setup complete, return next stage URL
"""
from __future__ import annotations
import base64, uuid
from pathlib import Path
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Form
from models.schemas import PhotoUploadResponse, SetupCompleteRequest, SuccessResponse
from middleware.auth_middleware import get_current_candidate
from services.auth_service import get_redirect_url, get_stage_name, advance_stage
from config import settings
from utils import json_db as db

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


@router.post("/photo", response_model=PhotoUploadResponse)
async def upload_photo(
    file: UploadFile = File(...),
    candidate: dict = Depends(get_current_candidate),
):
    """
    Accept candidate photo from setup screen.
    Stores in data/photos/{candidate_id}.jpg
    Returns photo_id for reference.
    """
    settings.PHOTO_DIR.mkdir(parents=True, exist_ok=True)

    # Validate content type
    if file.content_type not in ("image/jpeg", "image/png", "image/webp"):
        raise HTTPException(status_code=400, detail="Only JPEG, PNG, or WebP images are accepted.")

    # Limit size to 5 MB
    contents = await file.read()
    if len(contents) > 5 * 1024 * 1024:
        raise HTTPException(status_code=400, detail="Image too large. Maximum size is 5 MB.")

    photo_id   = str(uuid.uuid4())
    ext        = "jpg" if file.content_type == "image/jpeg" else "png"
    photo_path = settings.PHOTO_DIR / f"{candidate['id']}_{photo_id}.{ext}"

    with open(photo_path, "wb") as f:
        f.write(contents)

    # Record photo in sessions.json
    db.insert(settings.SESSIONS_FILE, {
        "candidate_id": candidate["id"],
        "photo_id":     photo_id,
        "photo_path":   str(photo_path),
        "event":        "photo_captured",
    })

    return PhotoUploadResponse(
        success=True,
        photo_id=photo_id,
        message="Photo captured and stored successfully.",
        fraud_check={"status": "pending", "note": "Face verification will run at session start"},
    )


@router.post("/complete", response_model=SuccessResponse)
async def setup_complete(
    body: SetupCompleteRequest,
    candidate: dict = Depends(get_current_candidate),
):
    """
    Mark setup as complete. Returns the interview URL for candidate's current stage.
    """
    # Log setup completion
    db.insert(settings.SESSIONS_FILE, {
        "candidate_id": candidate["id"],
        "event":        "setup_complete",
        "photo_id":     body.photo_id,
        "camera_ok":    body.camera_ok,
        "mic_ok":       body.mic_ok,
        "network_ok":   body.network_ok,
    })

    stage       = candidate.get("current_stage", 1)
    redirect    = get_redirect_url(stage)
    stage_name  = get_stage_name(stage)

    return SuccessResponse(
        message=f"Setup complete. Proceeding to {stage_name}.",
        data={
            "redirect_url": redirect,
            "stage":        stage,
            "stage_name":   stage_name,
        },
    )
