<?php

namespace Tests\App\Libraries;

use App\Libraries\Tuition\NewTuitionCalculatorService;
use CodeIgniter\Test\CIUnitTestCase;

class NewTuitionCalculatorServiceTest extends CIUnitTestCase
{
    public function testFamilyDiscountsApplyByStudentPosition(): void
    {
        $service = new NewTuitionCalculatorService();
        $result = $service->calculateFamilyTuition([
            ['student_id' => 4, 'student_name' => 'Fourth', 'grade_level' => '4'],
            ['student_id' => 1, 'student_name' => 'First', 'grade_level' => '1'],
            ['student_id' => 3, 'student_name' => 'Third', 'grade_level' => '3'],
            ['student_id' => 2, 'student_name' => 'Second', 'grade_level' => '2'],
        ], [
            'grade_fee' => 9,
            'new_tuition_full_amount' => '350.00',
            'new_tuition_second_student_discount' => '50.00',
            'new_tuition_third_student_discount' => '50.00',
            'new_tuition_fourth_plus_discount' => '100.00',
        ]);

        $this->assertSame('1200.00', $result['total']);
        $this->assertSame('350.00', $result['details'][0]['amount']);
        $this->assertSame('300.00', $result['details'][1]['amount']);
        $this->assertSame('300.00', $result['details'][2]['amount']);
        $this->assertSame('250.00', $result['details'][3]['amount']);
    }

    public function testDiscountCannotDriveAmountBelowZero(): void
    {
        $service = new NewTuitionCalculatorService();
        $result = $service->calculateFamilyTuition([
            ['student_id' => 1, 'student_name' => 'One', 'grade_level' => '1'],
            ['student_id' => 2, 'student_name' => 'Two', 'grade_level' => '2'],
            ['student_id' => 3, 'student_name' => 'Three', 'grade_level' => '3'],
            ['student_id' => 4, 'student_name' => 'Four', 'grade_level' => '4'],
            ['student_id' => 5, 'student_name' => 'Five', 'grade_level' => '5'],
        ], [
            'grade_fee' => 9,
            'new_tuition_full_amount' => '75.00',
            'new_tuition_second_student_discount' => '50.00',
            'new_tuition_third_student_discount' => '50.00',
            'new_tuition_fourth_plus_discount' => '100.00',
        ]);

        $this->assertSame('125.00', $result['total']);
        $this->assertSame('0.00', $result['details'][3]['amount']);
        $this->assertSame('0.00', $result['details'][4]['amount']);
    }

    public function testYouthStudentsUseSeparateUnitPriceWithoutAffectingRegularDiscountOrder(): void
    {
        $service = new NewTuitionCalculatorService();
        $result = $service->calculateFamilyTuition([
            ['student_id' => 3, 'student_name' => 'Youth', 'grade_level' => 'Youth 1'],
            ['student_id' => 1, 'student_name' => 'Regular One', 'grade_level' => '2'],
            ['student_id' => 2, 'student_name' => 'Regular Two', 'grade_level' => '5'],
        ], [
            'grade_fee' => 9,
            'new_tuition_full_amount' => '370.00',
            'new_tuition_youth_amount' => '200.00',
            'new_tuition_second_student_discount' => '150.00',
            'new_tuition_third_student_discount' => '150.00',
            'new_tuition_fourth_plus_discount' => '150.00',
        ]);

        $this->assertSame('790.00', $result['total']);
        $this->assertSame('new_first_student_full_amount', $result['details'][0]['rule']);
        $this->assertSame('370.00', $result['details'][0]['amount']);
        $this->assertSame('new_second_student_discount', $result['details'][1]['rule']);
        $this->assertSame('220.00', $result['details'][1]['amount']);
        $this->assertSame('new_youth_unit_price', $result['details'][2]['rule']);
        $this->assertSame('200.00', $result['details'][2]['amount']);
    }
}
