"""Cálculos de precio compartidos del proceso comercial.

Peso volumétrico / a cobrar de carga aérea (doc maestro de cotización):
    P/Vol = (Largo_cm × Ancho_cm × Alto_cm × cantidad) / 6000
El peso a cobrar es el mayor entre el peso bruto y el P/Vol (estándar aéreo).
6000 cm³/kg es el factor internacional (equivale a ~167 kg/m³).
"""

from __future__ import annotations

from decimal import Decimal

# Factor internacional de peso volumétrico aéreo (cm³ por kg).
AIR_VOLUMETRIC_DIVISOR = Decimal("6000")


def _d(value) -> Decimal:
    if value is None:
        return Decimal(0)
    return value if isinstance(value, Decimal) else Decimal(str(value))


def air_volumetric_kg(length_cm, width_cm, height_cm, qty=1) -> Decimal:
    """Peso volumétrico aéreo a partir de dimensiones (cm) y cantidad de bultos.

    Devuelve 0 si falta alguna dimensión (no se puede calcular).
    """
    length, width, height = _d(length_cm), _d(width_cm), _d(height_cm)
    if length <= 0 or width <= 0 or height <= 0:
        return Decimal(0)
    quantity = _d(qty) if _d(qty) > 0 else Decimal(1)
    return (length * width * height * quantity) / AIR_VOLUMETRIC_DIVISOR


def air_chargeable_kg(gross_kg, length_cm, width_cm, height_cm, qty=1) -> Decimal:
    """Peso a cobrar aéreo: max(peso bruto, peso volumétrico por dimensiones)."""
    return max(_d(gross_kg), air_volumetric_kg(length_cm, width_cm, height_cm, qty))
