<?php

declare(strict_types=1);

namespace Tests\Feature\Filament;

use App\Filament\Resources\Plans\Pages\EditPlan;
use App\Filament\Resources\Plans\Pages\ListPlans;
use App\Models\Plan;
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;

/**
 * Gestión de planes en /admin: el super_admin puede modificar precios (ya no son
 * fijos), y el slug queda bloqueado en edición para no romper las referencias del
 * sistema (getDefaultPlan('basic'), registro de trial, etc.).
 */
class PlanResourceTest extends TestCase
{
    use DatabaseTransactions;

    private function actingAsSuperAdmin(): User
    {
        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());

        return $super;
    }

    #[Test]
    public function super_admin_can_list_plans(): void
    {
        $this->actingAsSuperAdmin();
        $plan = Plan::factory()->create(['name' => 'Plan de prueba']);

        Livewire::test(ListPlans::class)
            ->assertOk()
            ->assertCanSeeTableRecords([$plan]);
    }

    #[Test]
    public function super_admin_can_change_a_plan_price(): void
    {
        $this->actingAsSuperAdmin();
        $plan = Plan::factory()->create(['price' => 100000, 'annual_price' => 1000000]);

        Livewire::test(EditPlan::class, ['record' => $plan->getKey()])
            ->fillForm(['price' => 175000, 'annual_price' => 1750000])
            ->call('save')
            ->assertHasNoFormErrors();

        $plan->refresh();
        $this->assertEquals('175000.00', $plan->price);
        $this->assertEquals('1750000.00', $plan->annual_price);
    }

    #[Test]
    public function the_slug_is_locked_when_editing_an_existing_plan(): void
    {
        $this->actingAsSuperAdmin();
        $plan = Plan::factory()->create(['slug' => 'basic-locked', 'price' => 100000]);

        // El campo slug está deshabilitado en edición y se re-hidrata con su valor
        // original: aunque cambie otro campo, el slug no se altera.
        Livewire::test(EditPlan::class, ['record' => $plan->getKey()])
            ->fillForm(['name' => 'Nombre cambiado'])
            ->call('save')
            ->assertHasNoFormErrors();

        $plan->refresh();
        $this->assertSame('basic-locked', $plan->slug);
        $this->assertSame('Nombre cambiado', $plan->name);
    }
}
