from decimal import Decimal

from app.core.models.customer import Customer
from app.core.models.member import MemberLevel, MemberPointsLedger


def test_member_level_contains_pricing_and_points_rules():
    level = MemberLevel(
        tenant_id=1,
        name="Gold",
        code="gold",
        rank=20,
        discount_rate=Decimal("0.90"),
        points_multiplier=Decimal("1.50"),
        free_shipping_threshold=Decimal("59.00"),
        upgrade_spend=Decimal("1000.00"),
        upgrade_orders=10,
    )

    assert level.discount_rate == Decimal("0.90")
    assert level.points_multiplier == Decimal("1.50")
    assert level.is_active == 1


def test_customer_can_hold_membership_and_points_balance():
    customer = Customer(
        tenant_id=1,
        email="a@example.com",
        name="Alice",
        member_level_id=3,
        points_balance=120,
        total_spent=Decimal("499.00"),
        orders_count=4,
    )

    assert customer.member_level_id == 3
    assert customer.points_balance == 120
    assert customer.total_spent == Decimal("499.00")


def test_points_ledger_records_balance_after_change():
    ledger = MemberPointsLedger(
        tenant_id=1,
        customer_id=2,
        change_amount=50,
        balance_after=150,
        reason="order_paid",
    )

    assert ledger.change_amount == 50
    assert ledger.balance_after == 150
