from fastapi import APIRouter, File, HTTPException, UploadFile

from src.core.document_processor import to_png_bytes, validate_file
from src.core.extractor import (
    extract_document,
    extract_sales_order,
    extract_strategic_stock,
    extract_movement_out_pdf,
)

router = APIRouter(tags=["extract"])


def _handle_upload(file: UploadFile, document_type: str):
    file_name = file.filename or "unknown"
    try:
        validate_file(file_name)
        content = file.file.read()
        image_bytes = to_png_bytes(content, file_name)
    except Exception as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc

    try:
        return extract_document(document_type=document_type, image_bytes=image_bytes)
    except Exception as exc:
        raise HTTPException(status_code=502, detail=f"Extraction failed: {exc}") from exc


@router.post("/extract/invoice")
def extract_invoice(file: UploadFile = File(...)):
    return _handle_upload(file, "incoming_invoice")


@router.post("/extract/movement-out")
def extract_movement_out(file: UploadFile = File(...)):
    return _handle_upload(file, "movement_out")


@router.post("/extract/sales-order")
def extract_sales_order_route(file: UploadFile = File(...)):
    """Extract fields from a Sales Order PDF (slot 1 of Stock In)."""
    file_name = file.filename or "unknown"
    try:
        validate_file(file_name)
        content = file.file.read()
        image_bytes = to_png_bytes(content, file_name)
    except Exception as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc

    try:
        return extract_sales_order(image_bytes)
    except Exception as exc:
        raise HTTPException(status_code=502, detail=f"Extraction failed: {exc}") from exc


@router.post("/extract/strategic-stock")
def extract_strategic_stock_route(file: UploadFile = File(...)):
    """Extract fields from a Strategic Stock Movement Sheet PDF (slot 2 of Stock In)."""
    file_name = file.filename or "unknown"
    try:
        validate_file(file_name)
        content = file.file.read()
        image_bytes = to_png_bytes(content, file_name)
    except Exception as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc

    try:
        return extract_strategic_stock(image_bytes)
    except Exception as exc:
        raise HTTPException(status_code=502, detail=f"Extraction failed: {exc}") from exc


@router.post("/extract/movement-out-pdf")
def extract_movement_out_pdf_route(file: UploadFile = File(...)):
    """Extract fields from a Movement Out PDF (generated document with 3 signatures)."""
    file_name = file.filename or "unknown"
    try:
        validate_file(file_name)
        content = file.file.read()
        image_bytes = to_png_bytes(content, file_name)
    except Exception as exc:
        raise HTTPException(status_code=400, detail=str(exc)) from exc

    try:
        return extract_movement_out_pdf(image_bytes)
    except Exception as exc:
        raise HTTPException(status_code=502, detail=f"Extraction failed: {exc}") from exc


@router.get("/health")
def health():
    return {"status": "ok"}
