"""
Unit test suite verifying financial and business rules in Optimus Django application.
"""
from decimal import Decimal
from datetime import date
from django.test import TestCase
from apps.core.models import User, Package, Investment, Transaction, Rank
from apps.core.services.roi_service import ROIService
from apps.core.services.binary_engine import BinaryEngine
from apps.core.services.commission_engine import CommissionEngine


class BusinessRulesTestCase(TestCase):

    def setUp(self):
        self.package = Package.objects.create(name='Package $1000', amount=Decimal('1000.00'))
        self.user = User.objects.create_user(username='testuser', email='test@example.com', password='password123')
        self.sponsor = User.objects.create_user(username='sponsoruser', email='sponsor@example.com', password='password123')
        self.user.sponsor = self.sponsor
        self.user.save()

    def test_daily_roi_processing_and_idempotency(self):
        """Verify 0.5% daily ROI calculation, 200% capping, and idempotency."""
        inv = Investment.objects.create(
            user=self.user,
            package=self.package,
            amount=Decimal('1000.00'),
        )

        today = date.today()
        res1 = ROIService.process_daily_roi(target_date=today)
        self.assertEqual(res1['processed'], 1)
        self.assertEqual(res1['total_payout'], 5.00)  # 0.5% of 1000 = $5.00

        # Idempotency check: Second run on same date must be skipped
        res2 = ROIService.process_daily_roi(target_date=today)
        self.assertEqual(res2['processed'], 0)
        self.assertEqual(res2['skipped'], 1)

    def test_sequential_slab_matching(self):
        """Verify sequential slab matching with Power $10,750 vs Weaker $5,150."""
        self.user.left_leg_business = Decimal('10750.00')
        self.user.right_leg_business = Decimal('5150.00')
        self.user.save()

        # Step 1: Run matching
        res = BinaryEngine.process_sequential_slab_matching(self.user.id)
        self.assertEqual(res['matched_total'], '4000.00')
        self.assertEqual(res['available_power'], '6750.00')
        self.assertEqual(res['available_weaker'], '1150.00')
        self.assertEqual(res['new_schedules_count'], 3)
        self.assertEqual(res['new_matches_count'], 3)

        # Verify summary output
        summary = BinaryEngine.get_matching_summary(self.user)
        self.assertEqual(summary['matched_business'], '4000.00')
        self.assertEqual(summary['power_carry_forward'], '6750.00')
        self.assertEqual(summary['weaker_carry_forward'], '1150.00')

        # Step 2: Idempotency check — running again with same volumes must produce 0 new records
        res2 = BinaryEngine.process_sequential_slab_matching(self.user.id)
        self.assertEqual(res2['new_schedules_count'], 0)
        self.assertEqual(res2['matched_total'], '0.00')
        self.assertEqual(res2['available_power'], '6750.00')
        self.assertEqual(res2['available_weaker'], '1150.00')
    def test_level_income_distribution(self):
        """Verify level income distribution."""
        from apps.core.models import Genealogy
        Genealogy.objects.create(user=self.user, parent=self.sponsor, level=1)

        inv = Investment.objects.create(
            user=self.user,
            package=self.package,
            amount=Decimal('1000.00'),
        )

        res = CommissionEngine.distribute_level_income(inv)
        self.assertEqual(res['distributed_count'], 1)
        self.assertEqual(res['total_level_payout'], 50.00)  # 5% of 1000 = $50.00
