<?php

namespace App\Livewire\Auth;

use Jantinnerezo\LivewireAlert\Facades\LivewireAlert;
use Livewire\Attributes\Layout;
use \Illuminate\Support\Facades\Auth;
use App\Support\Http\HandlesHttpErrors;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Http;
use Livewire\Component;

class Authentication extends Component
{
    use HandlesHttpErrors;
    public $api_base_url;
    public  $email;
    public  $password;

      protected $rules = [
        'email' => 'required|email',
        'password' => 'required',
    ];

    protected $messages = [
        'email.required'  => 'O campo email é obrigatório',
        'email.email'   => 'O email deve ser válido',
        'password.required' => 'O campo senha é obrigatório',
    ];

    
    public function mount () {
        $this->api_base_url = config('services.api.base_url');
        }

     #[Layout('layouts.user.app')]
     public function render(): View
    {
        return view('livewire.auth.authentication');
    }

    public function authenticate()
{
    try {
        $response = Http::withHeaders([
            'Accept' => 'application/json'])->post("{$this->api_base_url}/login", [
            'email' => $this->email,
            'password' => $this->password,
        ]);

        // 422 - Validação
        if ($response->status() === 422) {
            $errors = $response->json('errors', []);

            foreach ($errors as $field => $messages) {
                $this->addError($field, $messages[0] ?? 'Erro de validação');
            }
            return;
        }

        // 401 - Não autorizado
        if ($response->status() === 401) {
            LivewireAlert::title('Atenção')
                ->text($response->json('message') ?? 'Credenciais inválidas')
                ->error()
                ->withConfirmButton()
                ->confirmButtonText('Fechar')
                ->show();
            return;
        }

        // 403 - Acesso negado
        if ($response->status() === 403) {
            LivewireAlert::title('Atenção')
                ->text($response->json('message') ?? 'Acesso negado')
                ->warning()
                ->withConfirmButton()
                ->confirmButtonText('Fechar')
                ->timer(0)
                ->show();
            return;
        }

        // Outros erros HTTP
        if ($response->failed()) {
            $this->handleHttpError($response);
            return;
        }

        $data = $response->json();

        // Validação do contrato da API
        if (!isset($data['access_token']) || !isset($data['user']) || !is_array($data['user']) || !isset($data['user']['type'])) {
            $this->errorAlert('Credenciais incorretas,tente novamente.');
            return;
        }

        // Sucesso
        if ($response->successful()) {
            session([
                'access_token' => $data['access_token'],
                'user' => $data['user'],
            ]);
            
    
            if ($data['user']['type'] === 'admin' && $data['user']['status'] === 'active') {
                return redirect()->route('dashboard.admin.home');
            }
    
            if ($data['user']['type'] === 'client' && $data['user']['status'] === 'active') {
                return redirect()->route('dashboard.client.home');
            }           

        }

        // Tipo desconhecido
        //$this->errorAlert('Tipo de utilizador inválido.');

    } catch (\Throwable $th) {
        report($th);
        $this->errorAlert(
            'Ocorreu um erro ao realizar a operação. Contacte o administrador do sistema.'
        );
    }
}




    // public function authenticate () {
    //     $this->validate([
    //         'email' => 'required|email',
    //         'password' => 'required|string|min:6',
    //     ], [
    //         'email.required' => 'Campo obrigatório',
    //         'email.email' => 'Email inválido',
    //         'password.required' => 'Campo obrigatório',
    //         'password.min' => 'A senha deve ter no mínimo 6 caracteres',
    //     ]);
    //     try {
    //         if (Auth::attempt(["email" => $this->email ,"password" => $this->password])) {
    //             session()->forget('account_created');
    //             session([
    //                 'access_token' => $data['access_token'],
    //                 'user' => $data['user'],
    //             ]);
    //             if (auth()->user()->type === 'client') {
    //                 return redirect()->route('dashboard.client.home');
    //             }else if (auth()->user()->type === 'admin') {
    //                 return redirect()->route('dashboard.admin.home');
    //             }

    //         }else{
    //            LivewireAlert::title('Atenção')
    //             ->text('Credenciais inválidas, tente novamente.')
    //             ->warning()
    //             ->withConfirmButton()
    //             ->confirmButtonText('Fechar')
    //             ->show();
    //             }
    //             } catch (\Throwable $th) {

    //         LivewireAlert::title('Erro')
    //          ->text('Ocorreu um erro ao realizar a operação!')
    //          ->error()
    //          ->withConfirmButton()
    //          ->confirmButtonText('Fechar')
    //          ->show();            
    //     }

        
    // }

    public function close () {
       session()->forget('account_created');
    }

       public function updated($propertyName)
    {
        $this->validateOnly($propertyName);
    }
}
