<?php

declare(strict_types=1);

namespace Tests\Feature\Filament;

use App\Filament\Resources\Incomes\Pages\CreateIncomes;
use App\Models\Company;
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use PHPUnit\Framework\Attributes\Test;
use ReflectionMethod;
use Spatie\Permission\Models\Role;
use Tests\TestCase;

/**
 * Regresión #129 (Ronda 3, item 1): CreateIncomes::mutateFormDataBeforeCreate
 * sobreescribía `company_id` incondicionalmente con auth()->user()->company_id
 * — para un super_admin (company_id null) eso descartaba la company que había
 * elegido en el formulario (IncomeForm sí ofrece un Select de company para
 * super_admin) y el income quedaba huérfano (company_id=null).
 */
class CreateIncomeCompanyIdTest extends TestCase
{
    use DatabaseTransactions;

    protected function setUp(): void
    {
        parent::setUp();
        Role::firstOrCreate(['name' => 'admin', 'guard_name' => 'web']);
        Role::firstOrCreate(['name' => 'super_admin', 'guard_name' => 'web']);
    }

    private function mutate(array $data): array
    {
        $page = new CreateIncomes;
        $method = new ReflectionMethod(CreateIncomes::class, 'mutateFormDataBeforeCreate');
        $method->setAccessible(true);

        return $method->invoke($page, $data);
    }

    #[Test]
    public function super_admin_selected_company_is_preserved(): void
    {
        $company = Company::factory()->create();
        $superAdmin = User::factory()->create(['company_id' => null]);
        $superAdmin->assignRole('super_admin');
        $this->actingAs($superAdmin);

        $result = $this->mutate(['company_id' => $company->id, 'amount' => 1000]);

        $this->assertSame($company->id, $result['company_id']);
        $this->assertSame($superAdmin->id, $result['user_id']);
    }

    #[Test]
    public function regular_admin_gets_their_own_company_id_when_not_provided(): void
    {
        $company = Company::factory()->create();
        $admin = User::factory()->create(['company_id' => $company->id]);
        $admin->assignRole('admin');
        $this->actingAs($admin);

        $result = $this->mutate(['amount' => 1000]);

        $this->assertSame($company->id, $result['company_id']);
    }
}
