from __future__ import annotations

from decimal import Decimal
from typing import Any

from fastapi import HTTPException

from app.services.operations import to_decimal


def normalize_logistics_fields(
    waybill_no: str | None,
    freight_amount: Any,
    *,
    required: bool,
    order_photo_url: str | None = None,
    freight_required: bool | None = None,
) -> tuple[str | None, Decimal | None, str | None]:
    clean_waybill = str(waybill_no or "").strip()
    clean_photo_url = str(order_photo_url or "").strip()
    freight_missing = freight_amount is None or str(freight_amount).strip() == ""
    must_have_freight = required if freight_required is None else freight_required

    if required and (not clean_waybill and not clean_photo_url) and freight_missing and freight_required is None:
        raise HTTPException(status_code=400, detail="该出入库业务必须填写运单号或上传辅助照片，并填写运费")
    if required and (not clean_waybill and not clean_photo_url):
        raise HTTPException(status_code=400, detail="该出入库业务必须填写运单号或上传辅助照片")
    if must_have_freight and freight_missing:
        raise HTTPException(status_code=400, detail="该出入库业务必须填写运费")
    if freight_missing:
        return clean_waybill or None, None, clean_photo_url or None

    freight = to_decimal(freight_amount, "0.01")
    if freight < 0:
        raise HTTPException(status_code=400, detail="运费不能小于0")
    return clean_waybill or None, freight, clean_photo_url or None
