from decimal import Decimal

from app.services.commission_service import CommissionService


class FakeRule:
    def __init__(self, **kwargs):
        self.id = kwargs.get("id", 1)
        self.insurance_company_id = kwargs.get("insurance_company_id")
        self.vehicle_type = kwargs.get("vehicle_type")
        self.coverage_type = kwargs.get("coverage_type")
        self.rule_type = kwargs.get("rule_type", "percent")
        self.value = kwargs.get("value", Decimal("10"))
        self.priority = kwargs.get("priority", 100)
        self.active = kwargs.get("active", True)


def test_commission_rule_matching():
    svc = CommissionService(db=None)
    rule = FakeRule(insurance_company_id=1, vehicle_type="car", coverage_type="comprehensive")
    assert svc._rule_matches(rule, 1, "car", "comprehensive") is True
    assert svc._rule_matches(rule, 2, "car", "comprehensive") is False
    assert svc._rule_matches(rule, 1, "bike", "comprehensive") is False


def test_commission_percent_calculation():
    svc = CommissionService(db=None)
    rule = FakeRule(rule_type="percent", value=Decimal("15"))
    result = svc._apply_rule(rule, Decimal("10000"))
    assert result == Decimal("1500")


def test_commission_fixed_calculation():
    svc = CommissionService(db=None)
    rule = FakeRule(rule_type="fixed", value=Decimal("500"))
    result = svc._apply_rule(rule, Decimal("10000"))
    assert result == Decimal("500")


def test_commission_specificity():
    svc = CommissionService(db=None)
    generic = FakeRule()
    specific = FakeRule(insurance_company_id=1, vehicle_type="car")
    assert svc._specificity(specific) > svc._specificity(generic)


def test_auto_commission_uses_provided():
    svc = CommissionService(db=None)
    result = svc.auto_commission(1, Decimal("1000"), 1, "car", "comprehensive", Decimal("750"))
    assert result == Decimal("750")
