from fastapi import APIRouter, Depends
from fastapi.responses import JSONResponse
from pydantic import BaseModel
from typing import List, Optional
import traceback

from utils.turnstile_helper import verify_turnstile
from model.import_model import ImportModel

router = APIRouter()


class ImportOrderRow(BaseModel):
    orderId: Optional[str] = ""
    productId: Optional[str] = None
    productName: Optional[str] = None
    customer: str = ""
    items: str = ""
    address: str = ""
    phone: Optional[str] = None
    email: Optional[str] = None
    style: Optional[str] = None
    material: Optional[str] = None
    quantity: Optional[float] = 0
    price: Optional[float] = 0
    shipping: Optional[float] = 0
    tax: Optional[float] = 0
    size: Optional[str] = None
    design: Optional[str] = None
    orderDate: Optional[str] = ""
    setCount: Optional[float] = 0
    pack: Optional[float] = 0
    fnskuCode: Optional[str] = ""
    fnskuLink: Optional[str] = ""
    note: Optional[str] = ""
    packingNote: Optional[str] = ""
    status: Optional[str] = "Unpaid"


class ImportRequest(BaseModel):
    fileName: str
    fileSize: int
    rows: List[ImportOrderRow]
    id_khach_hang: Optional[str] = None


@router.post("/orders", dependencies=[Depends(verify_turnstile)])
async def import_orders_endpoint(payload: ImportRequest):
    try:
        result = ImportModel.process_import(
            file_name=payload.fileName,
            file_size=payload.fileSize,
            rows=[row.model_dump() for row in payload.rows],
            id_khach_hang=payload.id_khach_hang,
        )
        inserted_count = int(result.get("insertedOrderCount", 0) or 0)
        invalid_rows = int(result.get("invalidRows", 0) or 0)
        grouped_order_count = int(result.get("groupedOrderCount", 0) or 0)
        blocked_group_count = int(result.get("blockedGroupedOrderCount", 0) or 0)
        errors = result.get("errors", []) or []

        if invalid_rows > 0:
            return {
                "success": True,
                "data": result,
                "message": (
                    f"Import thành công: {inserted_count}/{grouped_order_count} đơn đã được tạo. "
                    f"Có {blocked_group_count} đơn cần được chỉnh sửa trước khi thanh toán."
                ),
                "errors": errors,
            }

        return {
            "success": True,
            "data": result,
            "message": f"Import thành công: {result.get('validRows', 0)} dòng hợp lệ, {inserted_count} đơn đã được tạo.",
            "errors": [],
        }
    except Exception as e:
        error_trace = traceback.format_exc()
        print("========== IMPORT API ERROR ==========")
        print(error_trace)
        return JSONResponse(
            status_code=500,
            content={
                "success": False,
                "message": "Import API bị lỗi",
                "error_type": type(e).__name__,
                "error_detail": str(e),
            },
        )


@router.post("/fba-fbt", dependencies=[Depends(verify_turnstile)])
async def import_fba_fbt_endpoint(payload: ImportRequest):
    """One FBA file becomes one order; each row becomes an item."""
    try:
        result = ImportModel.process_fba_fbt_import(
            file_name=payload.fileName,
            file_size=payload.fileSize,
            rows=[row.model_dump() for row in payload.rows],
            id_khach_hang=payload.id_khach_hang,
        )
        inserted_count = int(result.get("insertedOrderCount", 0) or 0)
        return {
            "success": inserted_count > 0,
            "data": result,
            "message": "Import FBA thành công." if inserted_count > 0 else "Không thể import FBA. Vui lòng kiểm tra tên sản phẩm và số lượng.",
            "errors": result.get("errors", []) or [],
        }
    except Exception as e:
        error_trace = traceback.format_exc()
        print("========== FBA IMPORT API ERROR ==========")
        print(error_trace)
        return JSONResponse(
            status_code=500,
            content={
                "success": False,
                "message": "Import FBA bị lỗi",
                "error_detail": str(e),
            },
        )
