<?php

namespace Tests\Unit\Payroll;

use App\Models\Company;
use App\Models\Expense;
use App\Models\User;
use App\Services\Payroll\PayrollPeriodDeductionService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class PayrollPeriodDeductionServiceTest extends TestCase
{
    use RefreshDatabase;

    public function test_expense_reimbursement_and_recovery_are_split_by_deduct_from_payroll_flag(): void
    {
        $company = Company::query()->create([
            'name' => 'Expense Payroll Co',
            'short_name' => 'EPC',
            'email' => 'expense-payroll@demo.local',
            'status' => 'active',
        ]);

        $user = User::factory()->create([
            'company_id' => $company->id,
            'status' => 'active',
        ]);

        Expense::create([
            'company_id' => $company->id,
            'user_id' => $user->id,
            'submitted_by' => $user->id,
            'category' => 'Travel',
            'amount' => 5000,
            'date' => '2026-03-15',
            'status' => 'approved',
            'deduct_from_payroll' => false,
        ]);

        Expense::create([
            'company_id' => $company->id,
            'user_id' => $user->id,
            'submitted_by' => $user->id,
            'category' => 'Advance recovery',
            'amount' => 1200,
            'date' => '2026-03-20',
            'status' => 'approved',
            'deduct_from_payroll' => true,
        ]);

        Expense::create([
            'company_id' => $company->id,
            'user_id' => $user->id,
            'submitted_by' => $user->id,
            'category' => 'Pending claim',
            'amount' => 900,
            'date' => '2026-03-18',
            'status' => 'pending',
            'deduct_from_payroll' => false,
        ]);

        $service = new PayrollPeriodDeductionService();

        $this->assertSame(5000.0, $service->expenseReimbursementAmount($user->id, $company->id, 2026, 3));
        $this->assertSame(1200.0, $service->expenseDeductionAmount($user->id, $company->id, 2026, 3));
    }

    public function test_processed_expenses_are_excluded_from_payroll_period_totals(): void
    {
        $company = Company::query()->create([
            'name' => 'Processed Expense Co',
            'short_name' => 'PEC',
            'email' => 'processed-expense@demo.local',
            'status' => 'active',
        ]);

        $user = User::factory()->create([
            'company_id' => $company->id,
            'status' => 'active',
        ]);

        Expense::create([
            'company_id' => $company->id,
            'user_id' => $user->id,
            'submitted_by' => $user->id,
            'category' => 'Travel',
            'amount' => 3000,
            'date' => '2026-04-10',
            'status' => 'approved',
            'deduct_from_payroll' => false,
            'payroll_cycle_id' => 99,
        ]);

        $service = new PayrollPeriodDeductionService();

        $this->assertSame(0.0, $service->expenseReimbursementAmount($user->id, $company->id, 2026, 4));
    }
}
