import math
import sys
from pathlib import Path
import unittest

PROJECT_ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(PROJECT_ROOT))

from pricing import PriceInput, calculate_pricing, suggest_price_tiers


class PricingCalculatorTest(unittest.TestCase):
    def test_liangzhu_default_formula_matches_handoff_example(self):
        result = calculate_pricing(
            PriceInput(
                product_name="测试良渚自研产品",
                tax_included_cost=360,
                freight=8,
                platform_rate=0.061,
                promotion_rate=0.10,
                team_rate=0.28,
                vat_rate=0.13,
                discount_rate=0.85,
            )
        )

        self.assertAlmostEqual(result.break_even_price_raw, 735.62, places=2)
        self.assertEqual(result.break_even_price_ceil, 736)
        self.assertAlmostEqual(result.list_price_raw, 865.44, places=2)
        self.assertEqual(result.list_price_ceil, 866)
        self.assertAlmostEqual(result.discount_sale_price, 736.10, places=2)
        self.assertTrue(result.discount_break_even)
        self.assertAlmostEqual(result.net_vat, (result.break_even_price_raw - 360) * 13 / 113, places=6)

    def test_suggest_price_tiers_returns_good_looking_prices_at_or_above_base(self):
        self.assertEqual(suggest_price_tiers(866)[:4], [866, 869, 879, 899])

    def test_invalid_denominator_is_rejected(self):
        with self.assertRaises(ValueError):
            calculate_pricing(
                PriceInput(
                    product_name="费率过高产品",
                    tax_included_cost=100,
                    freight=8,
                    platform_rate=0.4,
                    promotion_rate=0.3,
                    team_rate=0.2,
                    vat_rate=0.13,
                    discount_rate=0.85,
                )
            )


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