# app/modules/dispatch/routes.py
"""
Dispatch Module API Routes
Prefix: /api/v1/dispatch
"""
import json
import uuid

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

from app.core.database import get_db
from app.core.security import require_permission
from app.models.core_models import LoginUsers
from . import schemas, service

router = APIRouter()


# ─── Helper: collect all files from a multipart request ───────────────────────

async def _collect_files(request: Request) -> dict:
    """
    Parse multipart/form-data and return a dict of {field_name: UploadFile}.
    Files that are empty / have no filename are silently skipped.
    """
    files: dict = {}
    content_type = request.headers.get("content-type", "")
    if "multipart/form-data" not in content_type:
        return files
    try:
        form = await request.form()
        for key, val in form.multi_items():
            if hasattr(val, "filename") and val.filename:
                files[key] = val
    except Exception:
        pass
    return files


# ─── Dispatch Queue ───────────────────────────────────────────────────────────

@router.get("/queue", response_model=list[schemas.DispatchQueueItem])
async def get_dispatch_queue(
    db: AsyncSession = Depends(get_db),
    _=Depends(require_permission("YARD", "view")),
):
    """Return all PDI-approved chassis in the dispatch pipeline."""
    return await service.get_dispatch_queue(db)


# ─── Thermal Checksheet ───────────────────────────────────────────────────────

@router.get("/{chassis_id}/thermal-checksheet", response_model=schemas.ThermalChecksheetOut)
async def get_thermal_checksheet(
    chassis_id: uuid.UUID,
    db: AsyncSession = Depends(get_db),
    _=Depends(require_permission("YARD", "view")),
):
    """Fetch existing thermal checksheet for a chassis."""
    return await service.get_thermal_checksheet(db, chassis_id)


@router.post("/{chassis_id}/thermal-checksheet", response_model=schemas.ThermalChecksheetOut, status_code=201)
async def submit_thermal_checksheet(
    chassis_id: uuid.UUID,
    request: Request,
    db: AsyncSession = Depends(get_db),
    user: LoginUsers = Depends(require_permission("YARD", "create")),
):
    """
    Submit (or re-submit) the thermal checksheet for a chassis.
    Expects multipart/form-data with:
      - `data` field: JSON string of ThermalChecksheetData
      - `item_photo_{N}` fields: optional per-item photos (N = 1..26)
      - `mail_screenshot_{N}` fields: optional mail screenshots for manufacturing defects
      - `bus_photo_front`, `bus_photo_rear`, `bus_photo_rh`, `bus_photo_lh`: bus view photos
    """
    form_files = await _collect_files(request)

    # Extract the JSON data field
    try:
        form = await request.form()
    except Exception:
        form = {}

    data_str = None
    if form:
        data_str = form.get("data")
    if not data_str:
        raise HTTPException(status_code=422, detail="Missing `data` field in form submission")

    try:
        parsed = json.loads(data_str)
        data = schemas.ThermalChecksheetData(**parsed)
    except Exception as e:
        raise HTTPException(status_code=422, detail=f"Invalid `data` JSON: {e}")

    return await service.submit_thermal_checksheet(
        db=db,
        chassis_id=chassis_id,
        data=data,
        form_files=form_files,
        submitted_by_id=user.user_id,
    )


# ─── Gate Pass ────────────────────────────────────────────────────────────────

@router.get("/{chassis_id}/gate-pass", response_model=schemas.GatePassOut)
async def get_gate_pass(
    chassis_id: uuid.UUID,
    db: AsyncSession = Depends(get_db),
    _=Depends(require_permission("YARD", "view")),
):
    """Fetch the latest gate pass for a chassis."""
    return await service.get_gate_pass(db, chassis_id)


@router.post("/{chassis_id}/gate-pass", response_model=schemas.GatePassOut, status_code=201)
async def generate_gate_pass(
    chassis_id: uuid.UUID,
    request: Request,
    db: AsyncSession = Depends(get_db),
    user: LoginUsers = Depends(require_permission("YARD", "create")),
):
    """
    Generate the gate pass for a chassis.
    Expects multipart/form-data with:
      - `data` field: JSON string of GatePassData
      - `driver_photo`: optional driver photo file
    Marks the chassis as DISPATCHED.
    """
    form_files = await _collect_files(request)

    try:
        form = await request.form()
    except Exception:
        form = {}

    data_str = form.get("data") if form else None
    if not data_str:
        raise HTTPException(status_code=422, detail="Missing `data` field in form submission")

    try:
        parsed = json.loads(data_str)
        data = schemas.GatePassData(**parsed)
    except Exception as e:
        raise HTTPException(status_code=422, detail=f"Invalid `data` JSON: {e}")

    return await service.generate_gate_pass(
        db=db,
        chassis_id=chassis_id,
        data=data,
        form_files=form_files,
        created_by_id=user.user_id,
    )
