#!/usr/bin/env python3
"""Offline, synthetic comparable-basket calculator; it makes no network calls."""
from decimal import Decimal, InvalidOperation

CENT = Decimal("0.01")

def money(value, name):
    if value is None:
        raise ValueError(name + " is unknown")
    try:
        value = Decimal(str(value))
    except (InvalidOperation, ValueError):
        raise ValueError(name + " must be a decimal amount")
    if not value.is_finite() or value < 0:
        raise ValueError(name + " must be a non-negative finite amount")
    return value.quantize(CENT)

def comparable_basket(*, units_needed, pack_size, pack_price, per_order_charges,
                      identity_confirmed=None, eligible=None, current=None,
                      all_charges_accounted_for=None, max_surplus=None, exact_quantity=False):
    """All-in pack price plus all remaining per-order charges; never infer checkout."""
    if isinstance(units_needed, bool) or not isinstance(units_needed, int) or units_needed < 1:
        return {"decision": "HOLD", "reason": "invalid units_needed"}
    if isinstance(pack_size, bool) or not isinstance(pack_size, int) or pack_size < 1:
        return {"decision": "HOLD", "reason": "invalid pack_size"}
    if (identity_confirmed is not True or eligible is not True or per_order_charges is None
            or all_charges_accounted_for is not True or max_surplus is None or pack_price is None):
        return {"decision": "HOLD", "reason": "missing comparison evidence"}
    if current is None:
        return {"decision": "HOLD", "reason": "current availability is unknown"}
    if current is not True:
        return {"decision": "EXCLUDE", "reason": "not a current purchasable alternative"}
    if isinstance(max_surplus, bool) or not isinstance(max_surplus, int) or max_surplus < 0:
        return {"decision": "HOLD", "reason": "invalid max_surplus policy"}
    if not isinstance(exact_quantity, bool):
        return {"decision": "HOLD", "reason": "invalid exact_quantity policy"}
    try:
        pack_price = money(pack_price, "tax_inclusive_pack_price")
        per_order_charges = money(per_order_charges, "all_remaining_per_order_charges")
    except ValueError:
        return {"decision": "HOLD", "reason": "invalid monetary evidence"}
    packs = -(-units_needed // pack_size)  # whole packs only
    purchased_units = packs * pack_size
    surplus = purchased_units - units_needed
    if exact_quantity and surplus:
        return {"decision": "EXCLUDE", "reason": "exact quantity policy", "surplus_units": surplus}
    if surplus > max_surplus:
        return {"decision": "EXCLUDE", "reason": "surplus exceeds the stated policy"}
    delivered = pack_price * packs + per_order_charges  # remaining charges are once per order
    return {"decision": "REVIEW", "packs": packs, "purchased_units": purchased_units,
            "surplus_units": surplus, "delivered_total": delivered,
            "delivered_per_purchased_unit": (delivered / purchased_units).quantize(Decimal("0.0001")),
            "allocation_per_required_unit": (delivered / units_needed).quantize(Decimal("0.0001"))}

def self_test():
    confirmed = dict(identity_confirmed=True, eligible=True, current=True, all_charges_accounted_for=True, max_surplus=3)
    a = comparable_basket(units_needed=12, pack_size=6, pack_price="24", per_order_charges="4", **confirmed)
    b = comparable_basket(units_needed=12, pack_size=4, pack_price="15", per_order_charges="8", **confirmed)
    c = comparable_basket(units_needed=12, pack_size=5, pack_price="18", per_order_charges="0", **confirmed)
    assert (a["delivered_total"], a["delivered_per_purchased_unit"]) == (Decimal("52.00"), Decimal("4.3333"))
    assert (b["delivered_total"], b["delivered_per_purchased_unit"]) == (Decimal("53.00"), Decimal("4.4167"))
    assert c["surplus_units"] == 3 and c["allocation_per_required_unit"] == Decimal("4.5000")
    assert comparable_basket(units_needed=12, pack_size=5, pack_price="18", per_order_charges="0", exact_quantity=True, **confirmed)["decision"] == "EXCLUDE"
    assert comparable_basket(units_needed=12, pack_size=5, pack_price="18", per_order_charges="0", max_surplus=0, **{k:v for k,v in confirmed.items() if k != "max_surplus"})["decision"] == "EXCLUDE"
    assert comparable_basket(units_needed=12, pack_size=4, pack_price=None, per_order_charges="8", **confirmed)["decision"] == "HOLD"
    assert comparable_basket(units_needed=12, pack_size=4, pack_price="15", per_order_charges=None, **confirmed)["decision"] == "HOLD"
    assert comparable_basket(units_needed=12, pack_size=4, pack_price="15", per_order_charges="8", current=None, **{k:v for k,v in confirmed.items() if k != "current"})["decision"] == "HOLD"
    assert comparable_basket(units_needed=12, pack_size=4, pack_price="15", per_order_charges="8", current=False, **{k:v for k,v in confirmed.items() if k != "current"})["decision"] == "EXCLUDE"
    assert comparable_basket(units_needed=0, pack_size=4, pack_price="15", per_order_charges="8", **confirmed)["decision"] == "HOLD"
    return a, b, c

if __name__ == "__main__":
    a, b, c = self_test()
    print("Synthetic, tax-inclusive fixture; final charges are supplied evidence, never inferred.")
    for label, row in (("A", a), ("B", b), ("C", c)):
        print(label, row)
