<?php
ini_set('display_errors', 0);
error_reporting(0);

// Isola apenas o include do db.php em buffer, para suprimir qualquer output dele
ob_start();
include '../adm/config/db.php';
ob_end_clean();

require_once __DIR__ . '/inc/mailer.php';
require_once __DIR__ . '/inc/email_templates.php';

session_start();

header('Content-Type: application/json');

$response = ['success' => false, 'message' => 'Erro desconhecido.'];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $inputJSON = file_get_contents('php://input');
    $input = json_decode($inputJSON, TRUE);

    $nome       = trim($input['nome']       ?? '');
    $email      = trim($input['email']      ?? '');
    $cpf_raw    = $input['cpf_cnpj']        ?? '';
    $cpf_cnpj   = preg_replace('/\D/', '', $cpf_raw);
    $senha      = $input['senha']           ?? '';
    $senha_conf = $input['senha_conf']      ?? '';

    if (empty($nome) || empty($email) || empty($cpf_cnpj) || empty($senha)) {
        $response['message'] = "Todos os campos com * são obrigatórios.";
    } elseif ($senha !== $senha_conf) {
        $response['message'] = "As senhas não conferem.";
    } elseif (strlen($senha) < 6) {
        $response['message'] = "A senha deve ter pelo menos 6 caracteres.";
    } elseif (!isset($conn) || $conn->connect_error) {
        $response['message'] = "Falha na conexão com o banco de dados.";
    } else {
        $check = $conn->prepare("SELECT id FROM usuarios WHERE email_principal = ? OR cpf_cnpj = ? LIMIT 1");
        if (!$check) {
            $response['message'] = "Erro interno: " . $conn->error;
        } else {
            $check->bind_param("ss", $email, $cpf_cnpj);
            $check->execute();
            if ($check->get_result()->num_rows > 0) {
                $response['message'] = "E-mail ou CPF/CNPJ já cadastrado no sistema.";
            } else {
                $senhaHash = password_hash($senha, PASSWORD_DEFAULT);
                $dataNow   = date('Y-m-d H:i:s');
                $ncadastro = date('YmdHis') . rand(100, 999);

                $stmt = $conn->prepare("INSERT INTO usuarios (nome_completo, cpf_cnpj, email_principal, senha, status, data_cadastro, ncadastro) VALUES (?, ?, ?, ?, 'ATIVO', ?, ?)");
                if (!$stmt) {
                    $response['message'] = "Erro ao preparar: " . $conn->error;
                } else {
                    $stmt->bind_param("ssssss", $nome, $cpf_cnpj, $email, $senhaHash, $dataNow, $ncadastro);
                    if ($stmt->execute()) {
                        $user_id = $conn->insert_id;
                        $_SESSION['usuario_id']   = $user_id;
                        $_SESSION['usuario_nome'] = $nome;
                        $response = [
                            'success'  => true,
                            'redirect' => !empty($_SESSION['carrinho']) ? 'checkout.php' : ''
                        ];
                        // E-mail de verificação
                        try {
                            $token      = gerarTokenVerificacao();
                            $expiraEm   = date('Y-m-d H:i:s', strtotime('+24 hours'));
                            $proto      = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
                            $host       = $_SERVER['HTTP_HOST'] ?? 'localhost';
                            $scriptDir  = dirname($_SERVER['SCRIPT_NAME'] ?? '/nova/ajax_cadastro.php');
                            $linkVerif  = $proto . '://' . $host . $scriptDir . '/verificar-email.php?token=' . urlencode($token);

                            $stmtToken = $conn->prepare("UPDATE usuarios SET token_verificacao = ?, token_expira_em = ? WHERE id = ?");
                            $stmtToken->bind_param("ssi", $token, $expiraEm, $user_id);
                            $stmtToken->execute();

                            $loja      = _getLojaEmailData($conn);
                            $assunto   = '✉️ Confirme seu e-mail - ' . $loja['nome'];
                            $htmlEmail = emailVerificacaoCadastro($nome, $linkVerif, $loja);
                            enviarEmail($email, $nome, $assunto, $htmlEmail);
                        } catch (\Throwable $ex) {
                            error_log('[EMAIL] Verificação falhou: ' . $ex->getMessage());
                        }
                    } else {
                        $response['message'] = "Erro ao criar conta: " . $stmt->error;
                    }
                }
            }
        }
    }
} else {
    $response['message'] = "Método inválido.";
}

echo json_encode($response, JSON_UNESCAPED_UNICODE);
