<?php

namespace App\Livewire\Permissions;

use Livewire\Component;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class Edit extends Component
{
    public Permission $permission;
    public ?string $description = null;
    public array $roles = [];

    public function mount(Permission $permission)
    {
        // Protección opcional
        if ($permission->name === 'admin.users.index') {
            session()->flash('error', 'Este permiso no se puede editar.');
            return $this->redirect(route('permissions.index'), navigate: true);
        }

        $this->permission = $permission;
        $this->description = $permission->description;
        $this->roles = $permission->roles->pluck('name')->toArray();
    }

    protected function rules()
    {
        return [
            'description' => 'nullable|string',
            'roles' => 'array'
        ];
    }

    public function update()
    {
        $this->authorize('admin.permissions.edit');
        
        if ($this->permission->name === 'admin.users.index') {
            session()->flash('error', 'Este permiso no se puede editar.');
            return;
        }

        $validated = $this->validate();

        $this->permission->update([
            'description' => $validated['description'],
        ]);

        $this->permission->syncRoles($validated['roles'] ?? []);

        session()->flash('success', 'Permiso actualizado correctamente.');
    }

    public function delete()
    {
        $this->authorize('admin.permissions.destroy');
        
        if ($this->permission->name === 'admin.users.index') {
            session()->flash('error', 'Este permiso no se puede eliminar.');
            return;
        }

        $this->permission->delete();

        session()->flash('success', 'Permiso eliminado correctamente');

        return $this->redirect(route('permissions.index'), navigate: true);
    }

    public function render()
    {
        return view('livewire.permissions.edit', [
            'roles' => Role::all(),
        ])->layout('layouts.app');
    }
}

