<?php

namespace App\Livewire\Configurations\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 string $permissionSearch = '';

    public function mount(Role $role)
    {
        if ($role->name === 'admin') {
            session()->flash('error', 'No se puede modificar el rol administrador.');
            return $this->redirect(route('configurations.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 render()
    {
        $permissions = Permission::query()
            ->when($this->permissionSearch, function ($query) {
                $query->where('name', 'like', "%{$this->permissionSearch}%")
                    ->orWhere('description', 'like', "%{$this->permissionSearch}%")
                    ->orWhere('model', 'like', "%{$this->permissionSearch}%");
            })
            ->orderBy('model')
            ->orderBy('name')
            ->get();

        return view('livewire.configurations.roles.edit', [
            'availablePermissions' => $permissions,
        ])->layout('layouts.clean');
    }
}
