#!/usr/bin/env python3
"""
Plain checks on the buying brain. No framework, just runs and reports.
Pins the worked examples so future edits cannot quietly change the rule.

Run with:  python3 test_pricing.py
"""

import datetime
from bidbrain.pricing import (
    Car, assess, price_car, banned_engine, banned_make,
    GOVERNING_THRESHOLD, FLAT_SPREAD,
)

TODAY = datetime.date(2026, 6, 2)
passed = 0
failed = 0


def check(name, got, want):
    global passed, failed
    if got == want:
        passed += 1
        print(f"  ok   {name}")
    else:
        failed += 1
        print(f"  FAIL {name}: got {got!r}, wanted {want!r}")


def base(**kw):
    c = Car(reg="T", make="Ford", model="Fiesta", derivative="x",
            year=2019, mileage=40000, owners=2, grade=2, reserve=6500,
            cap_clean=7000, distance_miles=30, engine="1.1 Ti-VCT",
            service_history="full", glass_retail=8800, cazana_retail=8500)
    for k, v in kw.items():
        setattr(c, k, v)
    return c


print("Pricing rule")
# Glass over 10000 governs. 8800 * 1.15 = 10120 > 10000, so max bid 7120.
p = price_car(base())
check("glass governs over threshold", (p.governing_source, p.governing_value, p.max_bid),
      ("Glass's", 10120, 7120))

# Under threshold, take the higher of the two. Glass 7600*1.15=8740,
# Cazana 8200*1.15=9430, so Cazana governs, max bid 6430.
p = price_car(base(glass_retail=7600, cazana_retail=8200))
check("cazana governs under threshold", (p.governing_source, p.governing_value, p.max_bid),
      ("Cazana", 9430, 6430))

# Under threshold, glass higher, glass governs.
p = price_car(base(glass_retail=8000, cazana_retail=6000))
check("glass higher under threshold", (p.governing_source, p.max_bid),
      ("Glass's", 9200 - FLAT_SPREAD))

# Missing valuation is never guessed.
check("missing cazana means no price", price_car(base(cazana_retail=None)), None)

print("Hard gate")
check("mileage on limit rejected", assess(base(mileage=90000), TODAY).status, "rejected")
check("mileage under limit allowed", assess(base(mileage=89999), TODAY).status, "shortlist")
check("reserve on limit rejected", assess(base(reserve=11000), TODAY).status, "rejected")
check("age too old rejected", assess(base(year=2014), TODAY).status, "rejected")
check("age too new rejected", assess(base(year=2025), TODAY).status, "rejected")
check("age 2 years allowed", assess(base(year=2024), TODAY).status, "shortlist")
check("age 10 years allowed", assess(base(year=2016), TODAY).status, "shortlist")
check("distance over limit rejected", assess(base(distance_miles=211), TODAY).status, "rejected")
check("grade 4 rejected", assess(base(grade=4), TODAY).status, "rejected")
check("five owners rejected", assess(base(owners=5), TODAY).status, "rejected")

print("Bans")
check("banned make Land Rover", banned_make(base(make="Land Rover")) is not None, True)
check("banned make Volvo", banned_make(base(make="Volvo")) is not None, True)
check("PureTech banned", banned_engine(base(make="Peugeot", engine="1.2 PureTech")) is not None, True)
check("2.0 TFSI banned", banned_engine(base(make="Audi", engine="2.0 TFSI")) is not None, True)
check("1.5 TSI banned", banned_engine(base(make="VW", engine="1.5 TSI")) is not None, True)
check("Ford 1.0 EcoBoost 2017 banned", banned_engine(base(make="Ford", engine="1.0 EcoBoost", year=2017)) is not None, True)
check("Ford 1.0 EcoBoost 2021 allowed", banned_engine(base(make="Ford", engine="1.0 EcoBoost", year=2021)), None)
check("safe 1.1 Ti-VCT allowed", banned_engine(base(engine="1.1 Ti-VCT")), None)
check("unknown engine excluded", assess(base(engine=""), TODAY).status, "rejected")

print("Flags")
a = assess(base(vat_qualifying=True), TODAY)
check("vat flag present", any("VAT" in f for f in a.flags), True)
a = assess(base(service_history="none"), TODAY)
check("no history flagged", any("service history" in f.lower() for f in a.flags), True)

print(f"\n{passed} passed, {failed} failed")
raise SystemExit(1 if failed else 0)
