<?php
// includes/utm-tracking.php
// Sistema robusto para captura e rastreamento de UTMs

/**
 * Inicia sessão se ainda não foi iniciada
 */
function ensureSessionStarted() {
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }
}

/**
 * Captura e salva parâmetros UTM na sessão
 */
function saveUtmParamsToSession() {
    ensureSessionStarted();
    
    // Lista de parâmetros UTM e outros parâmetros de tracking
    $trackingParams = [
        'utm_source',
        'utm_medium', 
        'utm_campaign',
        'utm_term',
        'utm_content',
        'utm_id',
        'gclid',        // Google Ads
        'fbclid',       // Facebook Ads
        'msclkid',      // Microsoft Ads
        'ttclid',       // TikTok Ads
        'ref',          // Referrer personalizado
        'affiliate_id', // ID de afiliado
        'promo_code'    // Código promocional
    ];
    
    $utmData = [];
    $hasNewUtms = false;
    
    // Captura parâmetros da URL atual
    foreach ($trackingParams as $param) {
        if (isset($_GET[$param]) && !empty($_GET[$param])) {
            $utmData[$param] = sanitizeUtmParam($_GET[$param]);
            $hasNewUtms = true;
        }
    }
    
    // Se houver novos UTMs, atualiza a sessão
    if ($hasNewUtms) {
        // Preserva UTMs anteriores se não foram sobrescritos
        $existingUtms = $_SESSION['utm_params'] ?? [];
        $_SESSION['utm_params'] = array_merge($existingUtms, $utmData);
        
        // Adiciona timestamp da primeira captura
        if (!isset($_SESSION['utm_params']['first_visit'])) {
            $_SESSION['utm_params']['first_visit'] = time();
        }
        
        // Atualiza timestamp da última captura
        $_SESSION['utm_params']['last_update'] = time();
        
        // Salva referrer
        if (isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER'])) {
            $_SESSION['utm_params']['referrer'] = $_SERVER['HTTP_REFERER'];
        }
        
        // Salva IP e User Agent
        $_SESSION['utm_params']['ip'] = $_SERVER['REMOTE_ADDR'] ?? '';
        $_SESSION['utm_params']['user_agent'] = $_SERVER['HTTP_USER_AGENT'] ?? '';
        
        // Log para debug
        if (function_exists('logInfo')) {
            logInfo("UTMs capturados: " . json_encode($_SESSION['utm_params']));
        }
    }
    
    // Retorna os parâmetros atuais
    return $_SESSION['utm_params'] ?? [];
}

/**
 * Sanitiza parâmetros UTM
 */
function sanitizeUtmParam($param) {
    // Remove caracteres perigosos e limita tamanho
    $param = strip_tags($param);
    $param = htmlspecialchars($param, ENT_QUOTES, 'UTF-8');
    return substr($param, 0, 255); // Limita a 255 caracteres
}

/**
 * Obtém parâmetros UTM da sessão
 */
function getUtmParams() {
    ensureSessionStarted();
    return $_SESSION['utm_params'] ?? [];
}

/**
 * Registra conversão com UTMs
 */
function registerConversion($pageId, $conversionType = 'page_view', $additionalData = []) {
    global $db;
    
    ensureSessionStarted();
    $utmParams = getUtmParams();
    
    try {
        // Monta dados da conversão
        $conversionData = array_merge([
            'page_id' => $pageId,
            'conversion_type' => $conversionType,
            'ip' => $_SERVER['REMOTE_ADDR'] ?? '',
            'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
            'conversion_time' => date('Y-m-d H:i:s')
        ], $utmParams, $additionalData);
        
        // Insere no banco
        $db->query("INSERT INTO utm_conversions SET 
                   page_id = :page_id,
                   conversion_type = :conversion_type,
                   utm_source = :utm_source,
                   utm_medium = :utm_medium,
                   utm_campaign = :utm_campaign,
                   utm_term = :utm_term,
                   utm_content = :utm_content,
                   gclid = :gclid,
                   fbclid = :fbclid,
                   referrer = :referrer,
                   ip = :ip,
                   user_agent = :user_agent,
                   additional_data = :additional_data,
                   created_at = NOW()");
        
        $db->bind(':page_id', $pageId);
        $db->bind(':conversion_type', $conversionType);
        $db->bind(':utm_source', $utmParams['utm_source'] ?? '');
        $db->bind(':utm_medium', $utmParams['utm_medium'] ?? '');
        $db->bind(':utm_campaign', $utmParams['utm_campaign'] ?? '');
        $db->bind(':utm_term', $utmParams['utm_term'] ?? '');
        $db->bind(':utm_content', $utmParams['utm_content'] ?? '');
        $db->bind(':gclid', $utmParams['gclid'] ?? '');
        $db->bind(':fbclid', $utmParams['fbclid'] ?? '');
        $db->bind(':referrer', $utmParams['referrer'] ?? '');
        $db->bind(':ip', $utmParams['ip'] ?? '');
        $db->bind(':user_agent', $utmParams['user_agent'] ?? '');
        $db->bind(':additional_data', json_encode($additionalData));
        
        $db->execute();
        
        if (function_exists('logInfo')) {
            logInfo("Conversão registrada: $conversionType para página $pageId");
        }
        
        return true;
        
    } catch (Exception $e) {
        if (function_exists('logError')) {
            logError("Erro ao registrar conversão: " . $e->getMessage());
        }
        return false;
    }
}

/**
 * Envia UTMs para pixels de tracking
 */
function sendUtmsToPixels() {
    $utmParams = getUtmParams();
    
    if (empty($utmParams)) {
        return;
    }
    
    // Prepara dados para envio via JavaScript
    $trackingData = [
        'utm_source' => $utmParams['utm_source'] ?? '',
        'utm_medium' => $utmParams['utm_medium'] ?? '', 
        'utm_campaign' => $utmParams['utm_campaign'] ?? '',
        'utm_term' => $utmParams['utm_term'] ?? '',
        'utm_content' => $utmParams['utm_content'] ?? '',
        'gclid' => $utmParams['gclid'] ?? '',
        'fbclid' => $utmParams['fbclid'] ?? ''
    ];
    
    echo "<script>
    // Envia UTMs para Facebook Pixel
    if (typeof fbq !== 'undefined') {
        fbq('track', 'PageView', " . json_encode($trackingData) . ");
    }
    
    // Envia UTMs para Google Analytics
    if (typeof gtag !== 'undefined') {
        gtag('event', 'page_view', {
            'custom_map': {
                'utm_source': '" . ($utmParams['utm_source'] ?? '') . "',
                'utm_medium': '" . ($utmParams['utm_medium'] ?? '') . "',
                'utm_campaign': '" . ($utmParams['utm_campaign'] ?? '') . "'
            }
        });
    }
    
    // Envia para JoinAds se disponível
    if (typeof window.joinads !== 'undefined') {
        window.joinads.track('page_view', " . json_encode($trackingData) . ");
    }
    
    // Debug no console
    console.log('UTM Tracking Data:', " . json_encode($trackingData) . ");
    </script>";
}

/**
 * Cria tabela para tracking de UTMs se não existir
 */
function createUtmTrackingTable() {
    global $db;
    
    try {
        $sql = "CREATE TABLE IF NOT EXISTS utm_conversions (
            id INT PRIMARY KEY AUTO_INCREMENT,
            page_id INT,
            conversion_type VARCHAR(50),
            utm_source VARCHAR(255),
            utm_medium VARCHAR(255), 
            utm_campaign VARCHAR(255),
            utm_term VARCHAR(255),
            utm_content VARCHAR(255),
            utm_id VARCHAR(255),
            gclid VARCHAR(255),
            fbclid VARCHAR(255),
            msclkid VARCHAR(255),
            ttclid VARCHAR(255),
            referrer TEXT,
            ip VARCHAR(45),
            user_agent TEXT,
            additional_data JSON,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
            INDEX idx_page_id (page_id),
            INDEX idx_conversion_type (conversion_type),
            INDEX idx_utm_source (utm_source),
            INDEX idx_utm_campaign (utm_campaign),
            INDEX idx_created_at (created_at)
        )";
        
        $db->query($sql);
        $db->execute();
        
        if (function_exists('logInfo')) {
            logInfo("Tabela utm_conversions criada/verificada com sucesso");
        }
        
    } catch (Exception $e) {
        if (function_exists('logError')) {
            logError("Erro ao criar tabela utm_conversions: " . $e->getMessage());
        }
    }
}

/**
 * Relatório de UTMs para análise
 */
function getUtmReport($dateStart = null, $dateEnd = null) {
    global $db;
    
    if (!$dateStart) $dateStart = date('Y-m-d', strtotime('-30 days'));
    if (!$dateEnd) $dateEnd = date('Y-m-d');
    
    try {
        $db->query("SELECT 
                   utm_source,
                   utm_medium,
                   utm_campaign,
                   COUNT(*) as conversions,
                   COUNT(DISTINCT ip) as unique_visitors
                   FROM utm_conversions 
                   WHERE DATE(created_at) BETWEEN :start AND :end
                   GROUP BY utm_source, utm_medium, utm_campaign
                   ORDER BY conversions DESC");
        
        $db->bind(':start', $dateStart);
        $db->bind(':end', $dateEnd);
        
        return $db->resultSet();
        
    } catch (Exception $e) {
        if (function_exists('logError')) {
            logError("Erro ao gerar relatório de UTMs: " . $e->getMessage());
        }
        return [];
    }
}

// Inicializa sistema de tracking
function initUtmTracking() {
    // Cria tabela se necessário
    createUtmTrackingTable();
    
    // Captura UTMs da URL atual
    saveUtmParamsToSession();
    
    // Debug das UTMs capturadas
    if (isset($_GET['debug_utm']) && $_GET['debug_utm'] == '1') {
        echo "<pre style='background:#000;color:#0f0;padding:10px;position:fixed;top:10px;right:10px;z-index:99999;'>";
        echo "UTMs Capturados:\n";
        print_r(getUtmParams());
        echo "</pre>";
    }
}

// Auto-executar se chamado diretamente
if (basename(__FILE__) == basename($_SERVER['SCRIPT_NAME'])) {
    initUtmTracking();
}
?>