<?php

namespace App\Livewire\Roles;

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

class Edit extends Component
{
    public Role $role;
    public string $name = '';
    public string $fullname = '';
    public ?string $description = null;
    public array $permissions = [];

    public function mount(Role $role)
    {
        if ($role->name === 'admin') {
            session()->flash('error', 'No se puede modificar el rol administrador.');
            return $this->redirect(route('roles.index'), navigate: true);
        }

        $this->role = $role;
        $this->name = $role->name ?? '';
        $this->fullname = $role->fullname ?? '';
        $this->description = $role->description;
        $this->permissions = $role->permissions->pluck('name')->toArray();
    }

    protected function rules()
    {
        return [
            'name' => "required|string|unique:roles,name,{$this->role->id}",
            'fullname' => 'required|string|max:255',
            'description' => 'nullable|string',
        ];
    }

    public function update()
    {
        $this->authorize('admin.roles.edit');
        
        if ($this->role->name === 'admin') {
            session()->flash('error', 'No se puede modificar el rol administrador.');
            return;
        }

        $validated = $this->validate();

        $this->role->update([
            'name' => $validated['name'],
            'fullname' => $validated['fullname'],
            'description' => $validated['description'],
        ]);

        $this->role->syncPermissions($this->permissions ?? []);

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

    public function delete()
    {
        $this->authorize('admin.roles.destroy');
        
        if ($this->role->name === 'admin') {
            session()->flash('error', 'No se puede borrar el rol administrador.');
            return;
        }

        $this->role->delete();

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

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

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

