#!/usr/bin/env python3
"""Offline synthetic cross-currency evidence gate. Python 3.9+, standard library only."""
from collections import Counter
from decimal import Decimal, ROUND_HALF_UP, localcontext

MONEY = Decimal("0.01")
BASELINE = "delivered-tax-included"
ROUNDING = "HALF_UP cents"


def decision(row):
    """Return COMPARE only for a complete, timely, same-basis conversion chain."""
    required = ("amount", "quote_timestamp", "rate_effective_timestamp", "rate_available_timestamp", "rate_source", "rate_version",
                "pair", "source_currency", "report_currency", "price_basis", "tax_shipping_complete", "rounding", "rate")
    if any(key not in row or row[key] is None or row[key] == "" for key in required):
        return "HOLD", "missing conversion evidence"
    if not isinstance(row["amount"], Decimal) or not row["amount"].is_finite() or row["amount"] < 0:
        return "HOLD", "amount is not a finite non-negative Decimal"
    if not isinstance(row["rate"], Decimal) or not row["rate"].is_finite() or row["rate"] <= 0:
        return "HOLD", "rate is not a finite positive Decimal"
    if not isinstance(row["quote_timestamp"], int) or isinstance(row["quote_timestamp"], bool) or row["quote_timestamp"] < 0:
        return "HOLD", "quote timestamp is not a non-negative integer minute"
    for key in ("rate_effective_timestamp", "rate_available_timestamp"):
        if not isinstance(row[key], int) or isinstance(row[key], bool) or row[key] < 0:
            return "HOLD", "rate time is not a non-negative integer minute"
    if row["source_currency"] != "EUR" or row["report_currency"] != "USD" or row["pair"] != "EUR/USD":
        return "HOLD", "declared currencies and pair are not EUR to USD"
    if row["price_basis"] != BASELINE:
        return "HOLD", "price basis differs from the declared baseline"
    if row["rounding"] != ROUNDING:
        return "HOLD", "rounding rule is unsupported"
    if type(row["tax_shipping_complete"]) is not bool or not row["tax_shipping_complete"]:
        return "HOLD", "tax/shipping basis is incomplete"
    if row["rate_effective_timestamp"] > row["quote_timestamp"]:
        return "HOLD", "future effective rate"
    if row["rate_available_timestamp"] > row["quote_timestamp"]:
        return "HOLD", "rate was not available as of quote time"
    if row["quote_timestamp"] - row["rate_effective_timestamp"] > 60:
        return "HOLD", "stale rate"
    with localcontext() as context:
        context.prec = 28
        converted = (row["amount"] * row["rate"]).quantize(MONEY, rounding=ROUND_HALF_UP)
    return "COMPARE", "EUR/USD rate applied", converted


ROWS = [
    {"id": "C1", "amount": Decimal("100.00"), "source_currency": "EUR", "report_currency": "USD", "pair": "EUR/USD", "rate": Decimal("1.2500"), "quote_timestamp": 600, "rate_effective_timestamp": 570, "rate_available_timestamp": 575, "rate_source": "SYNTHETIC", "rate_version": "v1", "price_basis": BASELINE, "tax_shipping_complete": True, "rounding": ROUNDING},
    {"id": "C2", "amount": Decimal("100.00"), "source_currency": "EUR", "report_currency": "USD", "pair": "EUR/USD", "rate": Decimal("1.2500"), "quote_timestamp": 600, "rate_effective_timestamp": 480, "rate_available_timestamp": 485, "rate_source": "SYNTHETIC", "rate_version": "v1", "price_basis": BASELINE, "tax_shipping_complete": True, "rounding": ROUNDING},
    {"id": "C3", "amount": Decimal("100.00"), "source_currency": "EUR", "report_currency": "USD", "pair": "EUR/USD", "rate": Decimal("1.2500"), "quote_timestamp": 600, "rate_effective_timestamp": 601, "rate_available_timestamp": 602, "rate_source": "SYNTHETIC", "rate_version": "v1", "price_basis": BASELINE, "tax_shipping_complete": True, "rounding": ROUNDING},
    {"id": "C4", "amount": Decimal("100.00"), "source_currency": "EUR", "report_currency": "USD", "pair": "USD/EUR", "rate": Decimal("0.8000"), "quote_timestamp": 600, "rate_effective_timestamp": 570, "rate_available_timestamp": 575, "rate_source": "SYNTHETIC", "rate_version": "v1", "price_basis": BASELINE, "tax_shipping_complete": True, "rounding": ROUNDING},
    {"id": "C5", "amount": Decimal("100.00"), "source_currency": "EUR", "report_currency": "USD", "pair": "EUR/USD", "rate": Decimal("1.2500"), "quote_timestamp": 600, "rate_effective_timestamp": 570, "rate_available_timestamp": 575, "rate_source": "SYNTHETIC", "rate_version": "v1", "price_basis": "tax/shipping unknown", "tax_shipping_complete": False, "rounding": ROUNDING},
    {"id": "C6", "amount": Decimal("10.004"), "source_currency": "EUR", "report_currency": "USD", "pair": "EUR/USD", "rate": Decimal("1.0000"), "quote_timestamp": 600, "rate_effective_timestamp": 570, "rate_available_timestamp": 575, "rate_source": "SYNTHETIC", "rate_version": "v1", "price_basis": BASELINE, "tax_shipping_complete": True, "rounding": ROUNDING},
    {"id": "C7", "amount": Decimal("10.005"), "source_currency": "EUR", "report_currency": "USD", "pair": "EUR/USD", "rate": Decimal("1.0000"), "quote_timestamp": 600, "rate_effective_timestamp": 570, "rate_available_timestamp": 575, "rate_source": "SYNTHETIC", "rate_version": "v1", "price_basis": BASELINE, "tax_shipping_complete": True, "rounding": ROUNDING},
    {"id": "C8", "amount": Decimal("100.00"), "source_currency": "EUR", "report_currency": "USD", "pair": "EUR/USD", "rate": Decimal("1.2500"), "quote_timestamp": None, "rate_effective_timestamp": 570, "rate_available_timestamp": 575, "rate_source": "", "rate_version": "", "price_basis": BASELINE, "tax_shipping_complete": True, "rounding": ROUNDING},
    {"id": "C9", "amount": Decimal("100.00"), "source_currency": "EUR", "report_currency": "USD", "pair": "EUR/USD", "rate": Decimal("1.2000"), "quote_timestamp": 660, "rate_effective_timestamp": 630, "rate_available_timestamp": 635, "rate_source": "SYNTHETIC", "rate_version": "v2", "price_basis": BASELINE, "tax_shipping_complete": True, "rounding": ROUNDING},
]

results = []
for row in ROWS:
    result = decision(row)
    label, reason = result[0], result[1]
    shown = str(result[2]) if len(result) == 3 else "—"
    results.append((row["id"], label, reason, shown))
    print(f"{row['id']}: {label} | {reason} | {shown}")

counts = Counter(label for _, label, _, _ in results)
assert counts == Counter({"HOLD": 5, "COMPARE": 4})
assert results[0][3] == "125.00"
assert results[5][3] == "10.00" and results[6][3] == "10.01"
assert results[8][3] == "120.00"
assert decision({**ROWS[0], "rate": Decimal("NaN")})[:2] == ("HOLD", "rate is not a finite positive Decimal")
assert decision({**ROWS[0], "rate": Decimal("Infinity")})[:2] == ("HOLD", "rate is not a finite positive Decimal")
assert decision({**ROWS[0], "rate": Decimal("-Infinity")})[:2] == ("HOLD", "rate is not a finite positive Decimal")
assert decision({**ROWS[0], "rate": Decimal("0")})[:2] == ("HOLD", "rate is not a finite positive Decimal")
assert decision({**ROWS[0], "quote_timestamp": 0, "rate_effective_timestamp": 0, "rate_available_timestamp": 0})[0] == "COMPARE"
assert decision({**ROWS[0], "rounding": "banker"})[:2] == ("HOLD", "rounding rule is unsupported")
assert decision({**ROWS[0], "tax_shipping_complete": 1})[:2] == ("HOLD", "tax/shipping basis is incomplete")
assert decision({**ROWS[0], "rate_available_timestamp": 601})[:2] == ("HOLD", "rate was not available as of quote time")
print("COUNTS: COMPARE=4 HOLD=5 REPORT_SEPARATELY=0")
print("NETWORK_REQUESTS: 0")
