<?php

namespace App\Livewire\Admin;

use App\Services\UserService; // <-- Importe seu Service
use Livewire\Component;

class CreateUser extends Component
{
    // 1. Propriedades públicas (os campos do formulário)
    // Elas substituem o 'Request $request'
    public string $name = '';
    public string $email = '';
    public string $password = '';
    public string $password_confirm = ''; // <-- Você também precisa deste
    public bool $permission_level = false;

    // 2. As regras de validação (copiadas do seu controller)
    // Nota: Adicionei 'same:password' para garantir que as senhas batem.
    protected $rules = [
        'name' => 'required|string|max:255',
        'email' => 'required|email',
        'password' => 'required|string|min:8',
        'password_confirm' => 'required|string|same:password', // <-- Regra importante!
        'permission_level' => 'required|boolean' // ou 'required|in:0,1'
    ];

    protected $messages = [
        'name' => 'Nome precisa ser informado.',
        'email' => 'O email precisa ser informado.',
        'password' => 'A senha precisa ter 8 ou mais caracteres.',
        'password_confirm' => 'As senhas não coincidem.',
        'permission_level' => 'Defina o nível de autorização do usuário.'
    ];

    /**
     * O método de "salvar", que substitui o seu 'createUsers'.
     *
     * Note como injetamos o UserService direto no método!
     * O Livewire cuida disso para você, assim como o Laravel faz nos controllers.
     */
    public function save(UserService $userService)
    {

        // 3. Valida as propriedades públicas ($this->name, $this->email, etc.)
        $validated = $this->validate($this->rules, $this->messages);
        // 4. Seu 'try...catch' - praticamente idêntico
        try {

            // 5. CHAMA O MESMO SERVICE! Nenhuma lógica de negócio é duplicada.
            $user = $userService->createUser($validated);

            // 6. O "Sucesso" (Tradução do Redirect)

            // Limpa o formulário
            $this->reset();

            // Dispara um evento para o Alpine.js fechar o modal
            $this->dispatch('user-created');

            // Envia a mesma mensagem de sucesso do seu controller
            session()->flash('message', 'Usuário cadastrado com sucesso!');

            // (Opcional) Se sua tabela de usuários for outro componente Livewire,
            // você pode mandar ela atualizar assim:
            // $this->dispatch('refreshUserList'); 

        } catch (\Exception $e) {

            // 7. O "Erro" (Tradução do Redirect de Erro)
            // Em vez de redirecionar, adicionamos o erro ao formulário
            // para que o usuário veja na tela, sem refresh.
            if ($e->getMessage() == 'O e-mail já está cadastrado.') {
                $this->addError('email', $e->getMessage());
            }

            $this->addError('general', $e->getMessage());
        }
    }

    public function render()
    {
        return view('livewire.admin.create-user');
    }
}
