<?php
// includes/ads-functions.php

/**
 * Funções para gerenciar e renderizar anúncios do Google AdSense
 */

/**
 * Busca anúncios ativos para um determinado tipo de página
 * 
 * @param string $pageType Tipo de página (landing, step1, step2, step3, registration)
 * @return array Lista de anúncios a serem exibidos
 */
function getAdsForPage($pageType) {
    global $db;
    
    // Verificar se a tabela existe antes de consultar
    try {
        $db->query("SHOW TABLES LIKE 'ads'");
        if ($db->rowCount() === 0) {
            return []; // Tabela não existe
        }
        
        // Buscar anúncios que correspondam ao tipo de página ou configurados para 'all'
        $db->query("SELECT * FROM ads WHERE active = 1 AND (page_types LIKE :type OR page_types LIKE '%all%')
                  ORDER BY position");
        $db->bind(':type', "%$pageType%");
        
        return $db->resultSet();
    } catch (Exception $e) {
        logError("Erro ao buscar anúncios: " . $e->getMessage());
        return [];
    }
}

/**
 * Renderiza um bloco de anúncio
 * 
 * @param array $ad Dados do anúncio
 * @return string HTML do anúncio
 */
function renderAd($ad) {
    $html = '<div class="adsense-container" data-ad-id="' . $ad['id'] . '">';
    $html .= '<!-- Anúncio: ' . htmlspecialchars($ad['name']) . ' -->';
    $html .= $ad['code'];
    $html .= '</div>';
    
    return $html;
}

/**
 * Insere anúncios em um conteúdo HTML nas posições especificadas
 * 
 * @param string $content Conteúdo HTML onde inserir os anúncios
 * @param string $pageType Tipo de página
 * @return string Conteúdo com anúncios inseridos
 */
function insertAdsInContent($content, $pageType) {
    // Se o conteúdo estiver vazio, retornar como está
    if (empty($content)) {
        return $content;
    }
    
    // Buscar anúncios para esta página
    $ads = getAdsForPage($pageType);
    
    // Se não houver anúncios, retornar o conteúdo original
    if (empty($ads)) {
        return $content;
    }
    
    // Organizar anúncios por posição
    $adsByPosition = [];
    foreach ($ads as $ad) {
        $position = $ad['position'];
        if (!isset($adsByPosition[$position])) {
            $adsByPosition[$position] = [];
        }
        $adsByPosition[$position][] = $ad;
    }
    
    // Dividir o conteúdo em parágrafos
    $pattern = '/<p>(.*?)<\/p>/s';
    preg_match_all($pattern, $content, $matches);
    $paragraphs = $matches[0];
    $totalParagraphs = count($paragraphs);
    
    // Se não houver parágrafos, retornar o conteúdo original
    if ($totalParagraphs == 0) {
        return $content;
    }
    
    // Preparar novo conteúdo
    $newContent = $content;
    
    // Posição: Após o primeiro parágrafo
    if (isset($adsByPosition['after-first']) && $totalParagraphs >= 1) {
        $p = $paragraphs[0];
        $adCode = '';
        foreach ($adsByPosition['after-first'] as $ad) {
            $adCode .= renderAd($ad);
        }
        $newContent = str_replace($p, $p . $adCode, $newContent);
    }
    
    // Posição: Após o segundo parágrafo
    if (isset($adsByPosition['after-second']) && $totalParagraphs >= 2) {
        $p = $paragraphs[1];
        $adCode = '';
        foreach ($adsByPosition['after-second'] as $ad) {
            $adCode .= renderAd($ad);
        }
        $newContent = str_replace($p, $p . $adCode, $newContent);
    }
    
    // Posição: Após o terceiro parágrafo
    if (isset($adsByPosition['after-third']) && $totalParagraphs >= 3) {
        $p = $paragraphs[2];
        $adCode = '';
        foreach ($adsByPosition['after-third'] as $ad) {
            $adCode .= renderAd($ad);
        }
        $newContent = str_replace($p, $p . $adCode, $newContent);
    }
    
    // Posição: No meio do conteúdo
    if (isset($adsByPosition['middle']) && $totalParagraphs >= 2) {
        $middleIndex = floor($totalParagraphs / 2) - 1;
        $p = $paragraphs[$middleIndex];
        $adCode = '';
        foreach ($adsByPosition['middle'] as $ad) {
            $adCode .= renderAd($ad);
        }
        $newContent = str_replace($p, $p . $adCode, $newContent);
    }
    
    // Posição: Antes do último parágrafo
    if (isset($adsByPosition['before-last']) && $totalParagraphs >= 2) {
        $p = $paragraphs[$totalParagraphs - 2];
        $adCode = '';
        foreach ($adsByPosition['before-last'] as $ad) {
            $adCode .= renderAd($ad);
        }
        $newContent = str_replace($p, $p . $adCode, $newContent);
    }
    
    // Posição: No final do conteúdo
    if (isset($adsByPosition['end']) && $totalParagraphs >= 1) {
        $p = $paragraphs[$totalParagraphs - 1];
        $adCode = '';
        foreach ($adsByPosition['end'] as $ad) {
            $adCode .= renderAd($ad);
        }
        $newContent = str_replace($p, $p . $adCode, $newContent);
    }
    
    // Inserir anúncios no cabeçalho (header)
    if (isset($adsByPosition['header'])) {
        $headerAds = '';
        foreach ($adsByPosition['header'] as $ad) {
            $headerAds .= renderAd($ad);
        }
        
        // Adicionar hook para header
        global $headerAdsHtml;
        $headerAdsHtml = $headerAds;
    }
    
    // Inserir anúncios no rodapé (footer)
    if (isset($adsByPosition['footer'])) {
        $footerAds = '';
        foreach ($adsByPosition['footer'] as $ad) {
            $footerAds .= renderAd($ad);
        }
        
        // Adicionar hook para footer
        global $footerAdsHtml;
        $footerAdsHtml = $footerAds;
    }
    
    // Inserir anúncios na barra lateral (sidebar)
    if (isset($adsByPosition['sidebar'])) {
        $sidebarAds = '';
        foreach ($adsByPosition['sidebar'] as $ad) {
            $sidebarAds .= renderAd($ad);
        }
        
        // Adicionar hook para sidebar
        global $sidebarAdsHtml;
        $sidebarAdsHtml = $sidebarAds;
    }
    
    return $newContent;
}

/**
 * Renderiza o bloco de anúncios para uma posição específica do layout
 * 
 * @param string $position Posição (header, footer, sidebar)
 * @return void Imprime o HTML diretamente
 */
function displayAdsInPosition($position) {
    switch ($position) {
        case 'header':
            global $headerAdsHtml;
            if (!empty($headerAdsHtml)) {
                echo $headerAdsHtml;
            }
            break;
            
        case 'footer':
            global $footerAdsHtml;
            if (!empty($footerAdsHtml)) {
                echo $footerAdsHtml;
            }
            break;
            
        case 'sidebar':
            global $sidebarAdsHtml;
            if (!empty($sidebarAdsHtml)) {
                echo $sidebarAdsHtml;
            }
            break;
    }
}

/**
 * Rastreia cliques em anúncios (opcional, para estatísticas)
 */
function trackAdClick($adId) {
    global $db;
    
    try {
        $db->query("UPDATE ads SET clicks = clicks + 1 WHERE id = :id");
        $db->bind(':id', $adId);
        $db->execute();
    } catch (Exception $e) {
        logError("Erro ao registrar clique em anúncio: " . $e->getMessage());
    }
}

/**
 * Adiciona o CSS necessário para os anúncios
 */
function addAdStyles() {
    echo '<style>
    .adsense-container {
        margin: 2rem 0;
        padding: 1rem;
        background-color: transparent;
        border-radius: 0.75rem;
        text-align: center;
        overflow: hidden;
        clear: both;
    }
    
    .adsense-container iframe {
        margin: 0 auto;
    }
    
    @media (max-width: 768px) {
        .adsense-container {
            margin: 1.5rem 0;
            padding: 0.75rem;
        }
    }
    </style>';
}

// Inicializar variáveis globais para posições especiais
$headerAdsHtml = '';
$footerAdsHtml = '';
$sidebarAdsHtml = '';