<?php

namespace Tests\Unit;

use App\Models\IncomeTaxPlan;
use App\Models\TaxSlab;
use App\Services\Payroll\TdsCalculator;
use PHPUnit\Framework\TestCase;

class TdsCalculatorTest extends TestCase
{
    public function test_computes_tax_with_standard_deduction_and_slabs(): void
    {
        $plan = new IncomeTaxPlan([
            'allow_deductions' => true,
            'standard_deduction' => 50000,
        ]);

        $slabs = collect([
            new TaxSlab(['slab_no' => 1, 'min_amount' => 0, 'max_amount' => 300000, 'tax_rate' => 0, 'cess_rate' => 4]),
            new TaxSlab(['slab_no' => 2, 'min_amount' => 300000, 'max_amount' => 600000, 'tax_rate' => 5, 'cess_rate' => 4]),
            new TaxSlab(['slab_no' => 3, 'min_amount' => 600000, 'max_amount' => null, 'tax_rate' => 10, 'cess_rate' => 4]),
        ]);

        $plan->setRelation('taxSlabs', $slabs);

        $calculator = new TdsCalculator();
        $result = $calculator->compute($plan, 800000, 150000);

        $this->assertSame(550000.0, $result['taxable_income']);
        $this->assertGreaterThan(0, $result['annual_tax']);
    }

    public function test_new_regime_ignores_deductions_when_not_allowed(): void
    {
        $plan = new IncomeTaxPlan([
            'allow_deductions' => false,
            'standard_deduction' => 75000,
        ]);

        $slabs = collect([
            new TaxSlab(['slab_no' => 1, 'min_amount' => 0, 'max_amount' => null, 'tax_rate' => 5, 'cess_rate' => 4]),
        ]);

        $plan->setRelation('taxSlabs', $slabs);

        $calculator = new TdsCalculator();
        $result = $calculator->compute($plan, 1000000, 200000);

        $this->assertSame(925000.0, $result['taxable_income']);
    }
}
