<?php

declare(strict_types=1);

namespace Tests\Feature\Filament;

use App\Filament\Resources\Users\Pages\CreateUser;
use App\Filament\Resources\Users\Pages\EditUser;
use App\Models\User;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Livewire\Livewire;
use PHPUnit\Framework\Attributes\Test;
use Spatie\Permission\Models\Role;
use Tests\TestCase;

/**
 * El UserForm marcaba `company_id` como `required()` incondicional, pero el
 * super_admin global no pertenece a ninguna empresa (company_id = null). Editarlo
 * —p.ej. cambiar su contraseña— fallaba con "required" sobre un campo que debe
 * quedar vacío. Ahora la compañía solo es obligatoria si el rol NO es super_admin.
 *
 * También fija que, con APP_LOCALE=es, los mensajes de validación se traducen
 * (antes salía la clave cruda `validation.required` por faltar `lang/es/validation.php`).
 */
class UserFormSuperAdminTest extends TestCase
{
    use DatabaseTransactions;

    #[Test]
    public function super_admin_can_be_edited_without_a_company(): void
    {
        Role::firstOrCreate(['name' => 'super_admin', 'guard_name' => 'web']);
        $super = User::factory()->create(['company_id' => null]);
        $super->assignRole('super_admin');
        $this->actingAs($super);
        Filament::setCurrentPanel(Filament::getDefaultPanel());

        Livewire::test(EditUser::class, ['record' => $super->getKey()])
            ->fillForm(['password' => 'nueva-clave-123'])
            ->call('save')
            ->assertHasNoFormErrors(); // antes: ['company_id' => 'required']

        $this->assertNull($super->fresh()->company_id, 'el super_admin sigue sin empresa');
    }

    #[Test]
    public function company_is_still_required_for_non_super_admin_users(): void
    {
        foreach (['super_admin', 'admin'] as $r) {
            Role::firstOrCreate(['name' => $r, 'guard_name' => 'web']);
        }
        $super = User::factory()->create(['company_id' => null]);
        $super->assignRole('super_admin');
        $this->actingAs($super);
        Filament::setCurrentPanel(Filament::getDefaultPanel());

        Livewire::test(CreateUser::class)
            ->fillForm([
                'name' => 'Nuevo Admin',
                'email' => 'nuevo_'.uniqid().'@credify.test',
                'roles' => [(int) Role::where('name', 'admin')->value('id')],
                'password' => 'clave-123',
                // sin company_id
            ])
            ->call('create')
            ->assertHasFormErrors(['company_id']); // sigue obligatorio para no-super
    }

    #[Test]
    public function spanish_validation_messages_are_resolved(): void
    {
        $this->app->setLocale('es');

        // Antes devolvía la clave cruda 'validation.required' (sin lang/es/validation.php).
        $this->assertNotSame('validation.required', trans('validation.required'));
        $this->assertStringContainsString('obligatorio', trans('validation.required'));
    }
}
