<?php

namespace App\Livewire\Users;

use App\Models\Auth\User;
use App\Models\Monitoring\Log;
use Livewire\Component;
use Spatie\Permission\Models\Role;

class Edit extends Component
{
    public User $user;
    public string $name = '';
    public string $email = '';
    public string $password = '';
    public string $password_confirmation = '';
    public string $role = '';

    public function mount(User $user)
    {
        if (!$user->is_editable()) {
            session()->flash('error', 'Este usuario no se puede editar');
            return $this->redirect(route('users.index'), navigate: true);
        }

        $this->user = $user;
        $this->name = $user->name ?? '';
        $this->email = $user->email ?? '';
        $this->role = $user->roles->first()?->name ?? '';
    }

    protected function rules()
    {
        return [
            'name' => 'required',
            'email' => 'required|email|unique:users,email,' . $this->user->id,
            'password' => 'nullable|confirmed|min:8',
            'role' => 'required|string|exists:roles,name',
        ];
    }

    public function update()
    {
        $this->authorize('admin.users.edit');
        
        if (!$this->user->is_editable()) {
            session()->flash('error', 'Este usuario no se puede editar');
            return $this->redirect(route('users.index'), navigate: true);
        }

        $validated = $this->validate();

        try {
            $fields = [
                'name' => $validated['name'],
                'email' => $validated['email'],
            ];

            if (!empty($validated['password'])) {
                $fields['password'] = bcrypt($validated['password']);
            }

            $this->user->update($fields);

            $this->user->syncRoles([$validated['role']]);

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

        } catch (\Exception $e) {
            Log::db('danger', '15011', 'User Update', 'User', $this->user->id, $e->getMessage());
            session()->flash('error', 'El usuario NO SE HA PODIDO ACTUALIZAR');
        }
    }

    public function delete()
    {
        $this->authorize('admin.users.destroy');
        
        if (!$this->user->is_deletable()) {
            session()->flash('error', 'Este usuario no se puede borrar porque es un administrador.');
            return;
        }

        $name = $this->user->name;
        $email = $this->user->email;

        $this->user->delete();

        session()->flash('success', "El usuario \"$name\" ($email) se eliminó con éxito.");

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

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

