<?php
class UsuariosController extends Controller {
    private $usuarioModel;

    public function __construct() {
        // Inicia a sessão se ainda não estiver iniciada
        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }

        $this->usuarioModel = $this->model('Usuario');
    }

    public function login() {
        $formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS);

        // Teste: verificar o conteúdo recebido do formulário
       // var_dump('Dados recebidos no login:', $formulario);

        if ($formulario && isset($formulario['email'], $formulario['senha'])) {
            $usuario = $this->usuarioModel->autenticar($formulario['email'], $formulario['senha']);

            // Teste: verificar o usuário autenticado
            //var_dump('Usuário autenticado:', $usuario);

            if ($usuario) {
                $_SESSION['usuario_id'] = $usuario->id_usuario ?? $usuario->id;
                $_SESSION['usuario_nome'] = $usuario->nome;

                // Teste: verificar sessão criada
                //var_dump('Sessão após login:', $_SESSION);

                // Teste: redirecionamento
                //echo "Redirecionando para dashboard...";
               // exit;

                // Redireciona para a página inicial após login
                header('Location: ' . URL . '/paginas/index');
                // exit;
            } else {
                Sessao::mensagem('login', 'E-mail ou senha inválidos', 'alert alert-danger');
            }
        }

        // Exibe tela de login (sem menu e sem rodapé)
        $this->view('usuarios/login', [
            'conteudo' => __DIR__ . '/../Views/usuarios/login.php',
            'dados'    => []
        ]);
    }

    public function logout() {
        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }
        session_destroy();
        header('Location: ' . URL . '/usuarios/login');
        exit;
    }

    public function cadastrar() {
        $formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS);

        if ($formulario && isset($formulario['nome'], $formulario['email'], $formulario['senha'])) {
            // Verifica se email já existe
            if ($this->usuarioModel->buscarPorEmail($formulario['email'])) {
                Sessao::mensagem('cadastro', 'E-mail já cadastrado', 'alert alert-danger');
            } else {
                // Cria usuário e redireciona para login
                $this->usuarioModel->criar($formulario);
                Sessao::mensagem('cadastro', 'Usuário cadastrado com sucesso!');
                header('Location: ' . URL . '/usuarios/login');
                exit;
            }
        }

        // Exibe tela de cadastro (sem menu e rodapé)
        $this->view('layout', [
            'conteudo' => __DIR__ . '/../Views/usuarios/cadastrar.php',
            'dados'    => []
        ]);
    }

    public function recuperarSenha() {
    $formulario = filter_input_array(INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS);

    if ($formulario && isset($formulario['email'])) {
        $usuario = $this->usuarioModel->buscarPorEmail($formulario['email']);
        if ($usuario) {
            $token = bin2hex(random_bytes(32));

            // Atualiza o token no banco
            $this->usuarioModel->atualizarTokenRecuperacao($usuario->id_usuario ?? $usuario->id, $token);

            // Envia o e-mail
            if ($this->enviarEmailRecuperacao($usuario->email, $token)) {
                Sessao::mensagem('recuperar', 'Instruções enviadas para seu e-mail.');
            } else {
                Sessao::mensagem('recuperar', 'Erro ao enviar o e-mail.', 'alert alert-danger');
            }

        } else {
            Sessao::mensagem('recuperar', 'E-mail não encontrado', 'alert alert-danger');
        }
    }

    $this->view('layout', [
        'conteudo' => __DIR__ . '/../Views/usuarios/recuperar_senha.php',
        'dados'    => []
    ]);
}


public function index()
{
    $dados = [
        'usuarios' => $this->usuarioModel->listarTodos()
    ];

    $this->view('layout', [
        'conteudo' => __DIR__ . '/../Views/usuarios/index.php',
        'dados'    => $dados
    ]);
}




    public function editar($id) {
        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }

        $usuario = $this->usuarioModel->buscarPorId($id);
        $form = filter_input_array(INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS);

        if ($form) {
            $atualiza = [
                'id'    => $id,
                'nome'  => $form['nome'] ?? '',
                'email' => $form['email'] ?? ''
            ];
            if ($this->usuarioModel->atualizar($atualiza)) {
                Sessao::mensagem('editar', 'Usuário atualizado com sucesso!');
                header('Location: ' . URL . '/usuarios/login');
                exit;
            } else {
                Sessao::mensagem('editar', 'Erro ao atualizar usuário', 'alert alert-danger');
            }
        }

        $this->view('layout', [
            'conteudo' => __DIR__ . '/../Views/usuarios/editar.php',
            'dados'    => ['usuario' => $usuario]
        ]);
    }

    public function novaSenha() {
    $token = $_GET['token'] ?? null;
    $form = filter_input_array(INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS);

    if ($token) {
        // Verifica se o token existe e é válido
        $usuario = $this->usuarioModel->verificarToken($token);
        if (!$usuario) {
            Sessao::mensagem('recuperar', 'Token inválido ou expirado', 'alert alert-danger');
            header('Location: ' . URL . '/usuarios/recuperarSenha');
            exit;
        }

        if ($form && isset($form['senha'], $form['confirma_senha'])) {
            if ($form['senha'] === $form['confirma_senha']) {
                $senhaHash = password_hash($form['senha'], PASSWORD_DEFAULT);

                if ($this->usuarioModel->atualizarSenhaComToken($token, $senhaHash)) {
                    Sessao::mensagem('login', 'Senha alterada com sucesso. Faça login.', 'alert alert-success');
                    header('Location: ' . URL . '/usuarios/login');
                    exit;
                } else {
                    Sessao::mensagem('recuperar', 'Erro ao alterar senha', 'alert alert-danger');
                }
            } else {
                Sessao::mensagem('recuperar', 'As senhas não coincidem', 'alert alert-warning');
            }
        }
    } else {
        Sessao::mensagem('recuperar', 'Token não fornecido', 'alert alert-danger');
        header('Location: ' . URL . '/usuarios/recuperarSenha');
        exit;
    }

    // Exibe tela de nova senha
    $this->view('layout', [
        'conteudo' => __DIR__ . '/../Views/usuarios/nova_senha.php',
        'dados'    => []
    ]);
}

public function definirSenha($token) {
    $usuario = $this->usuarioModel->verificarToken($token);

    if (!$usuario) {
        Sessao::mensagem('login', 'Token inválido ou expirado.', 'alert alert-danger');
        header('Location: ' . URL . '/usuarios/login');
        exit;
    }

    $form = filter_input_array(INPUT_POST, FILTER_SANITIZE_SPECIAL_CHARS);

    if ($form) {
        $senha = $form['senha'] ?? '';
        $confirmar = $form['confirmar_senha'] ?? '';

        if (strlen($senha) < 6) {
            Sessao::mensagem('nova_senha', 'A senha deve ter pelo menos 6 caracteres.', 'alert alert-warning');
        } elseif ($senha !== $confirmar) {
            Sessao::mensagem('nova_senha', 'As senhas não coincidem.', 'alert alert-warning');
        } else {
            $senhaHash = password_hash($senha, PASSWORD_DEFAULT);
            $this->usuarioModel->atualizarSenhaComToken($token, $senhaHash);

            Sessao::mensagem('login', 'Senha redefinida com sucesso! Faça login com a nova senha.');
            header('Location: ' . URL . '/usuarios/login');
            exit;
        }
    }

    $this->view('layout', [
        'conteudo' => __DIR__ . '/../Views/usuarios/nova_senha.php',
        'dados'    => []
    ]);
}




private function enviarEmailRecuperacao($email, $token) {
    require_once __DIR__ . '/../Libraries/Mailer.php';

    $link = URL . "/usuarios/definirSenha/$token";
    $assunto = "Recuperação de Senha - Sistema de Ordens de Viagem";

    $mensagem = "
        <h3>Olá,</h3>
        <p>Recebemos uma solicitação para redefinir sua senha.</p>
        <p>Clique no link abaixo para definir uma nova senha:</p>
        <p><a href=\"$link\">$link</a></p>
        <p>Se você não solicitou isso, ignore este e-mail.</p>
        <br><small>Este link expira após o uso ou alteração da senha.</small>
    ";

    return Mailer::enviar($email, $assunto, $mensagem);
}

}
