<?php
/**
 * Webhook MercadoPago - Versão Simples Atualizada para SDK v3.5+
 * Mantém a lógica original, apenas atualiza para nova versão do SDK
 */

// DEBUG FORCE - REMOVER DEPOIS
$log  = "Data: " . date("Y-m-d H:i:s") . PHP_EOL;
$log .= "IP Origem: " . ($_SERVER['REMOTE_ADDR'] ?? 'N/A') . PHP_EOL;
$log .= "Método: " . ($_SERVER['REQUEST_METHOD'] ?? 'N/A') . PHP_EOL;
$log .= "Payload Recebido: " . file_get_contents('php://input') . PHP_EOL;
$log .= "GET Params: " . print_r($_GET, true) . PHP_EOL;
$log .= "-------------------------" . PHP_EOL;
file_put_contents(__DIR__ . '/webhook_debug_log.txt', $log, FILE_APPEND);

// Autoload do Composer
require __DIR__ . '/../vendor/autoload.php'; 

// Conexão com o banco de dados
require __DIR__ . '/../config/config_db.php'; 

// Importa o arquivo com o access token e configurações de email
require __DIR__ . '/../config/token.php';
require __DIR__ . '/../config_email/email_config.php'; // Arquivo de configuração de email

// Imports do SDK v3.5+
use MercadoPago\Client\Payment\PaymentClient;
use MercadoPago\MercadoPagoConfig;
use MercadoPago\Exceptions\MPApiException;

// PHPMailer para envio de email
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

// Configurar o token de acesso do Mercado Pago (Nova forma v3)
try {
    MercadoPagoConfig::setAccessToken(ACCESS_TOKEN);
    MercadoPagoConfig::setRuntimeEnviroment(MercadoPagoConfig::LOCAL);
} catch (Exception $e) {
    error_log('Erro na configuração do SDK: ' . $e->getMessage());
    http_response_code(500);
    echo json_encode(['status' => 'error', 'message' => 'Erro na configuração']);
    exit;
}

// Recebe e processa a notificação
$body = file_get_contents('php://input');
$notification = json_decode($body, true);

// DEBUG: Log após decodificar notificação
$debug_log = "Notificação decodificada: " . print_r($notification, true) . PHP_EOL;
file_put_contents(__DIR__ . '/webhook_debug_log.txt', $debug_log, FILE_APPEND);

// Valida se foi recebido um evento de pagamento
if (isset($notification['type']) && $notification['type'] == 'payment') {
    
    // Obtém os detalhes do pagamento via SDK v3
    $payment_id = $notification['data']['id'];
    
    try {
        // ============ NOVA FORMA DE BUSCAR PAGAMENTO COM SDK v3 ============
        $client = new PaymentClient();
        $payment = $client->get($payment_id);
        
        // DEBUG: Log do payment recebido da API
        $debug_log = "Payment recebido da API - ID: " . $payment->id . " - Status: " . $payment->status . PHP_EOL;
        file_put_contents(__DIR__ . '/webhook_debug_log.txt', $debug_log, FILE_APPEND);
        
        if ($payment->status == 'approved') {
            // DEBUG: Log antes de atualizar
            $debug_log = "Payment ID: " . $payment->id . " - Status: approved - Iniciando atualização no banco" . PHP_EOL;
            file_put_contents(__DIR__ . '/webhook_debug_log.txt', $debug_log, FILE_APPEND);
            
            // Atualiza a transação no banco de dados como 'Aprovado'
            $stmt = $pdo->prepare("UPDATE transacoes SET status = 'Aprovado', notificado = 1 WHERE payment_id = :payment_id");
            $stmt->execute([':payment_id' => $payment->id]);
            
            // DEBUG: Log após atualizar
            $rows_affected = $stmt->rowCount();
            $debug_log = "UPDATE executado - Linhas afetadas: " . $rows_affected . PHP_EOL;
            file_put_contents(__DIR__ . '/webhook_debug_log.txt', $debug_log, FILE_APPEND);
            
            // Puxa os dados da transação e do produto para enviar o email e calcular comissões
            $stmt = $pdo->prepare("
                SELECT 
                    t.*, 
                    p.tipo_entrega,
                    p.tipo_produto,
                    p.entrega_dados_titulo,
                    p.entrega_dados_descricao,
                    p.entrega_dados_acesso,
                    p.entrega_dados_botao_texto,
                    p.entrega_dados_botao_link
                FROM transacoes t
                INNER JOIN produtos p ON p.id = t.produto_id
                WHERE t.payment_id = :payment_id
            ");
            $stmt->execute([':payment_id' => $payment->id]);
            $transaction = $stmt->fetch(PDO::FETCH_ASSOC);
            
            // Para produtos físicos, garantir que status_entrega esteja inicializado
            if ($transaction && ($transaction['tipo_produto'] ?? 'digital') === 'fisico') {
                try {
                    $stmt_update = $pdo->prepare("UPDATE transacoes SET status_entrega = 'preparando' WHERE payment_id = :payment_id AND (status_entrega IS NULL OR status_entrega = '')");
                    $stmt_update->execute([':payment_id' => $payment->id]);
                } catch (PDOException $e) {
                    // Se a coluna não existir, apenas loga (retrocompatibilidade)
                    if (strpos($e->getMessage(), 'status_entrega') === false) {
                        error_log("Erro ao atualizar status_entrega no webhook: " . $e->getMessage());
                    }
                }
            }
            
            // Calcular e registrar comissões (se ainda não foram calculadas)
            if ($transaction && $transaction['status'] == 'Aprovado') {
                require_once __DIR__ . '/financeiro_helper.php';
                
                // Verificar se já existe comissão registrada
                try {
                    $sql_check = "SELECT id FROM vendas_comissoes WHERE transacao_id = :transacao_id LIMIT 1";
                    $stmt_check = $pdo->prepare($sql_check);
                    $stmt_check->execute([':transacao_id' => $transaction['id']]);
                    $comissao_existe = $stmt_check->fetch(PDO::FETCH_ASSOC);
                    
                    if (!$comissao_existe && !empty($transaction['produto_id']) && !empty($transaction['produtor_id'])) {
                        calcular_e_registrar_comissoes(
                            $transaction['id'],
                            intval($transaction['produto_id']),
                            intval($transaction['produtor_id']),
                            !empty($transaction['afiliado_id']) ? intval($transaction['afiliado_id']) : null,
                            floatval($transaction['valor'])
                        );
                    }
                } catch (PDOException $e) {
                    // Se a tabela não existir, apenas loga o erro
                    if (strpos($e->getMessage(), "vendas_comissoes") === false) {
                        error_log("Erro ao verificar comissão no webhook: " . $e->getMessage());
                    }
                }
            }
            
            // Liberar acesso baseado no tipo de entrega
            liberarAcessoProduto($transaction, $pdo);
        } else if ($payment->status == 'rejected') {
            $stmt = $pdo->prepare("UPDATE transacoes SET status = 'Rejeitado', notificado = 1 WHERE payment_id = :payment_id");
            $stmt->execute([':payment_id' => $payment->id]);
        } else if ($payment->status == 'refunded' || $payment->status == 'charged_back' || 
                   (isset($payment->transaction_amount_refunded) && $payment->transaction_amount_refunded > 0)) {
            // Transação reembolsada - processar estorno de comissões
            $stmt = $pdo->prepare("UPDATE transacoes SET status = 'Reembolsado', notificado = 1 WHERE payment_id = :payment_id");
            $stmt->execute([':payment_id' => $payment->id]);
            
            // Buscar ID da transação para processar estorno
            $stmt = $pdo->prepare("SELECT id FROM transacoes WHERE payment_id = :payment_id LIMIT 1");
            $stmt->execute([':payment_id' => $payment->id]);
            $transaction = $stmt->fetch(PDO::FETCH_ASSOC);
            
            if ($transaction) {
                // Carregar helper financeiro para processar estorno
                require_once __DIR__ . '/financeiro_helper.php';
                // Processar estorno das comissões (subtrair dos saldos)
                processar_estorno_comissoes($transaction['id']);
            }
        }
        
    } catch (MPApiException $e) {
        error_log('Erro da API MercadoPago no webhook: ' . $e->getMessage());
        http_response_code(400);
        echo json_encode(['status' => 'error', 'message' => 'Erro ao buscar pagamento']);
        exit;
    } catch (Exception $e) {
        error_log('Erro geral no webhook: ' . $e->getMessage());
        http_response_code(500);
        echo json_encode(['status' => 'error', 'message' => 'Erro interno']);
        exit;
    }
}

// Resposta 200 OK
http_response_code(200);
echo json_encode(['status' => 'success']);

/**
 * Função para liberar acesso ao produto baseado no tipo de entrega
 */
function liberarAcessoProduto($transaction, $pdo) {
    // Produtos físicos não precisam liberar acesso digital
    $tipo_produto = $transaction['tipo_produto'] ?? 'digital';
    if ($tipo_produto === 'fisico') {
        return; // Produto físico não tem entrega digital
    }
    
    $tipo_entrega = $transaction['tipo_entrega'] ?? 'link';
    
    // Criar usuário se não existir (para todos os tipos de entrega)
    $stmt_user = $pdo->prepare("SELECT id FROM usuarios WHERE email = :email LIMIT 1");
    $stmt_user->execute([':email' => $transaction['email']]);
    $usuario = $stmt_user->fetch(PDO::FETCH_ASSOC);
    
    $usuario_id = null;
    
    if ($usuario) {
        $usuario_id = intval($usuario['id']);
    } else {
        // Criar usuário com senha aleatória
        $senha_aleatoria = bin2hex(random_bytes(8)); // 16 caracteres hexadecimais
        $senha_hash = password_hash($senha_aleatoria, PASSWORD_DEFAULT);
        $nome_completo = trim(($transaction['nome'] ?? '') . ' ' . ($transaction['sobrenome'] ?? ''));
        $nome_completo = !empty($nome_completo) ? $nome_completo : 'Cliente';
        
        try {
            // Tentar com schema moderno primeiro
            $stmt_insert_user = $pdo->prepare("
                INSERT INTO usuarios (nome, email, senha_hash, tipo, status, created_at)
                VALUES (:nome, :email, :senha_hash, 'usuario', 'ativo', NOW())
            ");
            $stmt_insert_user->execute([
                ':nome' => $nome_completo,
                ':email' => $transaction['email'],
                ':senha_hash' => $senha_hash
            ]);
            $usuario_id = intval($pdo->lastInsertId());
        } catch (PDOException $e) {
            // Se falhar, tentar com schema antigo
            if (strpos($e->getMessage(), 'senha_hash') !== false || strpos($e->getMessage(), 'tipo') !== false || strpos($e->getMessage(), 'status') !== false) {
                $stmt_insert_user = $pdo->prepare("
                    INSERT INTO usuarios (nome, email, senha, nivel, data_cadastro)
                    VALUES (:nome, :email, :senha, 'cliente', NOW())
                ");
                $stmt_insert_user->execute([
                    ':nome' => $nome_completo,
                    ':email' => $transaction['email'],
                    ':senha' => $senha_hash
                ]);
                $usuario_id = intval($pdo->lastInsertId());
            } else {
                error_log("Erro ao criar usuário no webhook: " . $e->getMessage());
                // Não lançar exceção, apenas logar
            }
        }
        
        // Enviar email com senha apenas se usuário foi criado
        if ($usuario_id) {
            try {
                enviarEmailSenhaCriada($transaction['email'], $nome_completo, $senha_aleatoria);
            } catch (Exception $e) {
                error_log("Aviso: Falha ao enviar email com senha (não bloqueia): " . $e->getMessage());
            }
        }
    }
    
    if ($tipo_entrega == 'area_membros') {
        // Tipo: Área de Membros - Criar matrícula
        try {
            if ($usuario_id) {
                
                // Verificar se já existe matrícula
                $stmt_mat = $pdo->prepare("
                    SELECT id FROM matriculas 
                    WHERE usuario_id = :usuario_id AND produto_id = :produto_id 
                    LIMIT 1
                ");
                $stmt_mat->execute([
                    ':usuario_id' => $usuario_id,
                    ':produto_id' => intval($transaction['produto_id'])
                ]);
                $matricula_existe = $stmt_mat->fetch(PDO::FETCH_ASSOC);
                
                if (!$matricula_existe) {
                    // Criar matrícula (acesso vitalício se data_expiracao for NULL)
                    $stmt_insert = $pdo->prepare("
                        INSERT INTO matriculas (usuario_id, produto_id, data_inicio, data_expiracao, status)
                        VALUES (:usuario_id, :produto_id, NOW(), NULL, 'ativo')
                    ");
                    $stmt_insert->execute([
                        ':usuario_id' => $usuario_id,
                        ':produto_id' => intval($transaction['produto_id'])
                    ]);
                } else {
                    // Atualizar matrícula existente para ativo
                    $stmt_update = $pdo->prepare("
                        UPDATE matriculas 
                        SET status = 'ativo', data_inicio = NOW() 
                        WHERE id = :id
                    ");
                    $stmt_update->execute([':id' => $matricula_existe['id']]);
                }
            }
        } catch (PDOException $e) {
            error_log("Erro ao criar matrícula no webhook: " . $e->getMessage());
        }
        
        // Enviar email de boas-vindas para área de membros
        $link_acesso = "https://" . $_SERVER['HTTP_HOST'] . "/dashboard/pages_usuario/curso_player.php?produto_id=" . intval($transaction['produto_id']);
        enviarEmailProdutoDigital(
            $transaction['email'], 
            $transaction['nome'], 
            $transaction['sobrenome'], 
            $transaction['descricao'], 
            $link_acesso,
            'area_membros'
        );
    } elseif ($tipo_entrega == 'dados_acesso') {
        // Tipo: Dados de Acesso - Enviar dados fixos por email
        $dados_acesso_texto = $transaction['entrega_dados_titulo'] . "\n\n";
        $dados_acesso_texto .= ($transaction['entrega_dados_descricao'] ?? '') . "\n\n";
        $dados_acesso_texto .= "Dados de Acesso:\n" . ($transaction['entrega_dados_acesso'] ?? '');
        
        enviarEmailProdutoDigital(
            $transaction['email'], 
            $transaction['nome'], 
            $transaction['sobrenome'], 
            $transaction['descricao'], 
            $dados_acesso_texto,
            'dados_acesso',
            $transaction['entrega_dados_botao_texto'] ?? 'Acessar',
            $transaction['entrega_dados_botao_link'] ?? ''
        );
    } else {
        // Tipo: Link Simples (padrão)
        $link_entregavel = $transaction['link_entregavel'] ?? '';
        enviarEmailProdutoDigital(
            $transaction['email'], 
            $transaction['nome'], 
            $transaction['sobrenome'], 
            $transaction['descricao'], 
            $link_entregavel,
            'link'
        );
    }
}

/**
 * Função para enviar email com senha criada automaticamente
 */
function enviarEmailSenhaCriada($email, $nome, $senha) {
    try {
        $mail = new PHPMailer(true);
        
        $mail->isSMTP();
        $mail->Host = EMAIL_HOST;
        $mail->SMTPAuth = true;
        $mail->Username = EMAIL_USERNAME;
        $mail->Password = EMAIL_PASSWORD;
        $mail->SMTPSecure = EMAIL_SMTP_SECURE;
        $mail->Port = EMAIL_PORT;
        
        $mail->setFrom(EMAIL_FROM, EMAIL_FROM_NAME);
        $mail->addAddress($email, $nome);
        
        $mail->isHTML(true);
        $mail->Subject = "Acesso criado - Checkout Pro";
        
        $emailBody = "<h2>Olá, " . htmlspecialchars($nome) . "!</h2>";
        $emailBody .= "<p>Uma conta foi criada automaticamente para você após sua compra.</p>";
        $emailBody .= "<p><strong>Seus dados de acesso:</strong></p>";
        $emailBody .= "<div style='background: #f7fafc; padding: 20px; border-radius: 8px; margin: 20px 0;'>";
        $emailBody .= "<p style='margin: 0;'><strong>E-mail:</strong> " . htmlspecialchars($email) . "</p>";
        $emailBody .= "<p style='margin: 10px 0 0 0;'><strong>Senha:</strong> <code style='background: #e5e7eb; padding: 5px 10px; border-radius: 4px; font-family: monospace;'>" . htmlspecialchars($senha) . "</code></p>";
        $emailBody .= "</div>";
        $emailBody .= "<p><strong>Importante:</strong> Guarde esta senha em local seguro e altere-a após o primeiro acesso.</p>";
        $emailBody .= "<p style='margin-top: 30px;'><a href='https://" . $_SERVER['HTTP_HOST'] . "/dashboard/login.php' style='background: #667eea; color: white; padding: 15px 30px; text-decoration: none; border-radius: 8px; display: inline-block;'>Acessar Minha Conta</a></p>";
        $emailBody .= "<p style='margin-top: 20px; color: #6b7280; font-size: 14px;'>Você também pode acessar seus produtos comprados na seção 'Minhas Compras' após fazer login.</p>";
        
        $mail->Body = $emailBody;
        $mail->send();
        
        return true;
    } catch (Exception $e) {
        error_log("Erro ao enviar email com senha: {$mail->ErrorInfo}");
        return false;
    }
}

/**
 * Função para enviar o email com o produto digital
 */
function enviarEmailProdutoDigital($email, $firstName, $lastName, $productTitle, $linkEntregavel, $tipoEntrega = 'link', $botaoTexto = '', $botaoLink = '') {
    $mail = new PHPMailer(true);
    
    try {
        // Configurações do servidor de email
        $mail->isSMTP();
        $mail->Host = EMAIL_HOST; 
        $mail->SMTPAuth = true;
        $mail->Username = EMAIL_USERNAME; 
        $mail->Password = EMAIL_PASSWORD; 
        $mail->SMTPSecure = EMAIL_SMTP_SECURE;
        $mail->Port = EMAIL_PORT;
        
        // Remetente e destinatário
        $mail->setFrom(EMAIL_FROM, EMAIL_FROM_NAME);
        $mail->addAddress($email, "$firstName $lastName");
        
        // Carrega o template de email e substitui as variáveis
        ob_start(); // Inicia o buffer de saída
        include __DIR__ . '/../config_email/conteudo_email.php'; // Template do email
        $emailBody = ob_get_clean(); // Captura o conteúdo gerado
        
        // Variáveis dinâmicas para o template
        $emailBody = str_replace('{{nome_completo}}', "$firstName $lastName", $emailBody);
        $emailBody = str_replace('{{titulo_produto}}', $productTitle, $emailBody);
        $emailBody = str_replace('{{link_entregavel}}', $linkEntregavel, $emailBody);
        
        // Conteúdo do email
        $mail->isHTML(true);
        $mail->Subject = "Acesso liberado ao $productTitle";
        $mail->Body = $emailBody;
        
        // Envia o email
        $mail->send();
        return true;
    } catch (Exception $e) {
        error_log("Erro ao enviar o email: {$mail->ErrorInfo}");
        return false;
    }
}
?>