"""Independent fictional code-review exercise; not a payment system.
Run: python code-review-practice.py
Contract: nonnegative integer cents, integer basis points in [0,10000].
Round the nonnegative discount half-up to a cent, then add undiscounted delivery.
No taxes, currencies, refunds, persistence, network calls or payment operations.
"""
import unittest

def intentionally_flawed(subtotal_cents, discount_bps, delivery_cents):
    """Teaching counterexample: truncates discounted subtotal; lacks validation."""
    return int(subtotal_cents * (1 - discount_bps / 10000)) + delivery_cents

def total_cents(subtotal_cents: int, discount_bps: int, delivery_cents: int) -> int:
    values = {'subtotal_cents': subtotal_cents, 'discount_bps': discount_bps,
              'delivery_cents': delivery_cents}
    for name, value in values.items():
        if type(value) is not int:
            raise TypeError(f'{name} must be an integer, not bool/float/text')
        if value < 0:
            raise ValueError(f'{name} cannot be negative')
    if discount_bps > 10000:
        raise ValueError('discount_bps cannot exceed 10000')
    discount_cents = (subtotal_cents * discount_bps + 5000) // 10000
    return subtotal_cents - discount_cents + delivery_cents

class ReviewChecks(unittest.TestCase):
    def test_reproduced_regression(self):
        self.assertEqual(intentionally_flawed(1001,1000,499),1399)
        self.assertEqual(total_cents(1001,1000,499),1400)
    def test_half_cent(self):
        self.assertEqual(total_cents(1,5000,0),0)
    def test_no_discount(self):
        self.assertEqual(total_cents(1001,0,499),1500)
    def test_full_discount(self):
        self.assertEqual(total_cents(1001,10000,499),499)
    def test_zero(self):
        self.assertEqual(total_cents(0,10000,0),0)
        self.assertEqual(total_cents(0,5000,499),499)
    def test_types(self):
        for value in [True,False,1.0,'1',None]:
            for index in range(3):
                args=[100,1000,50]; args[index]=value
                with self.assertRaises(TypeError): total_cents(*args)
    def test_range(self):
        for args in [(-1,0,0),(1,-1,0),(1,10001,0),(1,0,-1)]:
            with self.assertRaises(ValueError): total_cents(*args)
    def test_bounded_properties(self):
        for subtotal in range(101):
            results=[]
            for rate in [0,1,100,1000,5000,9999,10000]:
                result=total_cents(subtotal,rate,7)
                self.assertGreaterEqual(result,7)
                self.assertEqual(total_cents(subtotal,rate,12)-result,5)
                results.append(result)
            self.assertEqual(results,sorted(results,reverse=True))
            self.assertEqual(results[-1],7)
    def test_large_integer(self):
        self.assertEqual(total_cents(10**20,10000,3),3)

if __name__ == '__main__':
    unittest.main()
