import unittest
from decimal import Decimal

from apps.loans.calculations import allocate_recovery, build_installment_amounts


class LoanCalculationTests(unittest.TestCase):
    def test_installment_schedule_reconciles_exactly(self):
        amounts = build_installment_amounts(Decimal("10000.00"), 3)
        self.assertEqual(amounts, [Decimal("3333.33"), Decimal("3333.33"), Decimal("3333.34")])
        self.assertEqual(sum(amounts), Decimal("10000.00"))

    def test_salary_advance_single_installment(self):
        self.assertEqual(build_installment_amounts(Decimal("12500.00"), 1), [Decimal("12500.00")])

    def test_recovery_allocates_oldest_first(self):
        allocations = allocate_recovery(
            [(11, Decimal("2000.00")), (12, Decimal("3000.00"))],
            Decimal("2500.00"),
        )
        self.assertEqual(allocations, [(11, Decimal("2000.00")), (12, Decimal("500.00"))])


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