<?php
// api/track-action.php - API para rastrear ações dos usuários

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Content-Type');

// Define BASE_PATH se não estiver definido
if (!defined('BASE_PATH')) {
    define('BASE_PATH', dirname(dirname(__FILE__)));
}

require_once BASE_PATH . '/includes/config.php';
require_once BASE_PATH . '/includes/db.php';
require_once BASE_PATH . '/includes/functions.php';
require_once BASE_PATH . '/includes/visitor-tracking.php';

// Só aceitar POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['error' => 'Método não permitido']);
    exit;
}

try {
    // Obter dados do POST
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input) {
        throw new Exception('Dados inválidos');
    }
    
    $pageId = isset($input['page_id']) ? intval($input['page_id']) : 0;
    $action = isset($input['action']) ? sanitizeInput($input['action']) : '';
    $targetUrl = isset($input['target_url']) ? sanitizeInput($input['target_url']) : '';
    $timeSpent = isset($input['time_spent']) ? intval($input['time_spent']) : 0;
    $maxScroll = isset($input['max_scroll']) ? intval($input['max_scroll']) : 0;
    
    if ($pageId <= 0 || empty($action)) {
        throw new Exception('Parâmetros obrigatórios não fornecidos');
    }
    
    // Verificar se a página existe
    $db->query("SELECT id, title, type FROM pages WHERE id = :page_id");
    $db->bind(':page_id', $pageId);
    $page = $db->single();
    
    if (!$page) {
        throw new Exception('Página não encontrada');
    }
    
    // Gerar hash do visitante
    $visitorTracking = new VisitorTracking();
    $reflection = new ReflectionClass($visitorTracking);
    $generateHashMethod = $reflection->getMethod('generateVisitorHash');
    $generateHashMethod->setAccessible(true);
    $visitorHash = $generateHashMethod->invoke($visitorTracking);
    
    $getClientIPMethod = $reflection->getMethod('getClientIP');
    $getClientIPMethod->setAccessible(true);
    $clientIP = $getClientIPMethod->invoke($visitorTracking);
    
    // Registrar a ação na tabela de ações
    $db->query("INSERT INTO page_actions (page_id, visitor_hash, visitor_ip, action_type, target_url, time_spent, max_scroll, user_agent, created_at)
               VALUES (:page_id, :visitor_hash, :visitor_ip, :action_type, :target_url, :time_spent, :max_scroll, :user_agent, NOW())");
    
    $db->bind(':page_id', $pageId);
    $db->bind(':visitor_hash', $visitorHash);
    $db->bind(':visitor_ip', $clientIP);
    $db->bind(':action_type', $action);
    $db->bind(':target_url', $targetUrl);
    $db->bind(':time_spent', $timeSpent);
    $db->bind(':max_scroll', $maxScroll);
    $db->bind(':user_agent', $_SERVER['HTTP_USER_AGENT'] ?? 'unknown');
    
    $db->execute();
    
    $actionId = $db->lastInsertId();
    
    // Log para debug
    logInfo("Ação rastreada: {$action} na página {$page['title']} (ID: {$pageId}) por visitante {$visitorHash}");
    
    // Resposta de sucesso
    echo json_encode([
        'success' => true,
        'action_id' => $actionId,
        'message' => 'Ação registrada com sucesso'
    ]);
    
} catch (Exception $e) {
    logError("Erro no rastreamento de ação: " . $e->getMessage());
    
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage()
    ]);
}
?>

<?php
// api/track-engagement.php - API para rastrear engajamento contínuo

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Content-Type');

// Define BASE_PATH se não estiver definido
if (!defined('BASE_PATH')) {
    define('BASE_PATH', dirname(dirname(__FILE__)));
}

require_once BASE_PATH . '/includes/config.php';
require_once BASE_PATH . '/includes/db.php';
require_once BASE_PATH . '/includes/functions.php';
require_once BASE_PATH . '/includes/visitor-tracking.php';

// Só aceitar POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['error' => 'Método não permitido']);
    exit;
}

try {
    // Obter dados do POST
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input) {
        throw new Exception('Dados inválidos');
    }
    
    $pageId = isset($input['page_id']) ? intval($input['page_id']) : 0;
    $timeSpent = isset($input['time_spent']) ? intval($input['time_spent']) : 0;
    $maxScroll = isset($input['max_scroll']) ? intval($input['max_scroll']) : 0;
    $isActive = isset($input['is_active']) ? (bool)$input['is_active'] : true;
    
    if ($pageId <= 0) {
        throw new Exception('ID da página não fornecido');
    }
    
    // Gerar hash do visitante
    $visitorTracking = new VisitorTracking();
    $reflection = new ReflectionClass($visitorTracking);
    $generateHashMethod = $reflection->getMethod('generateVisitorHash');
    $generateHashMethod->setAccessible(true);
    $visitorHash = $generateHashMethod->invoke($visitorTracking);
    
    $getClientIPMethod = $reflection->getMethod('getClientIP');
    $getClientIPMethod->setAccessible(true);
    $clientIP = $getClientIPMethod->invoke($visitorTracking);
    
    $currentDate = date('Y-m-d');
    
    // Verificar se já existe um registro de engajamento hoje para este visitante nesta página
    $db->query("SELECT id, time_spent, max_scroll FROM page_engagement 
               WHERE page_id = :page_id 
               AND visitor_hash = :visitor_hash 
               AND DATE(created_at) = :current_date
               ORDER BY created_at DESC 
               LIMIT 1");
    
    $db->bind(':page_id', $pageId);
    $db->bind(':visitor_hash', $visitorHash);
    $db->bind(':current_date', $currentDate);
    
    $existing = $db->single();
    
    if ($existing) {
        // Atualizar registro existente apenas se os valores forem maiores
        $newTimeSpent = max($existing['time_spent'], $timeSpent);
        $newMaxScroll = max($existing['max_scroll'], $maxScroll);
        
        $db->query("UPDATE page_engagement 
                   SET time_spent = :time_spent,
                       max_scroll = :max_scroll,
                       is_active = :is_active,
                       updated_at = NOW()
                   WHERE id = :id");
        
        $db->bind(':time_spent', $newTimeSpent);
        $db->bind(':max_scroll', $newMaxScroll);
        $db->bind(':is_active', $isActive ? 1 : 0);
        $db->bind(':id', $existing['id']);
        
        $db->execute();
        
        $engagementId = $existing['id'];
    } else {
        // Criar novo registro de engajamento
        $db->query("INSERT INTO page_engagement (page_id, visitor_hash, visitor_ip, time_spent, max_scroll, is_active, user_agent, created_at)
                   VALUES (:page_id, :visitor_hash, :visitor_ip, :time_spent, :max_scroll, :is_active, :user_agent, NOW())");
        
        $db->bind(':page_id', $pageId);
        $db->bind(':visitor_hash', $visitorHash);
        $db->bind(':visitor_ip', $clientIP);
        $db->bind(':time_spent', $timeSpent);
        $db->bind(':max_scroll', $maxScroll);
        $db->bind(':is_active', $isActive ? 1 : 0);
        $db->bind(':user_agent', $_SERVER['HTTP_USER_AGENT'] ?? 'unknown');
        
        $db->execute();
        
        $engagementId = $db->lastInsertId();
    }
    
    // Resposta de sucesso
    echo json_encode([
        'success' => true,
        'engagement_id' => $engagementId,
        'time_spent' => $timeSpent,
        'max_scroll' => $maxScroll
    ]);
    
} catch (Exception $e) {
    logError("Erro no rastreamento de engajamento: " . $e->getMessage());
    
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'error' => $e->getMessage()
    ]);
}
?>

<?php
// SQL para criar as tabelas de ações e engajamento

/*
-- Tabela para rastrear ações específicas dos usuários
CREATE TABLE page_actions (
    id INT(11) NOT NULL AUTO_INCREMENT,
    page_id INT(11) NOT NULL,
    visitor_hash VARCHAR(64) NOT NULL,
    visitor_ip VARCHAR(45) DEFAULT NULL,
    action_type VARCHAR(50) NOT NULL,
    target_url TEXT DEFAULT NULL,
    time_spent INT(11) DEFAULT 0,
    max_scroll INT(3) DEFAULT 0,
    user_agent TEXT DEFAULT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY page_id (page_id),
    KEY visitor_hash (visitor_hash),
    KEY action_type (action_type),
    KEY created_at (created_at),
    CONSTRAINT page_actions_ibfk_1 FOREIGN KEY (page_id) REFERENCES pages (id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tabela para rastrear engajamento contínuo
CREATE TABLE page_engagement (
    id INT(11) NOT NULL AUTO_INCREMENT,
    page_id INT(11) NOT NULL,
    visitor_hash VARCHAR(64) NOT NULL,
    visitor_ip VARCHAR(45) DEFAULT NULL,
    time_spent INT(11) DEFAULT 0,
    max_scroll INT(3) DEFAULT 0,
    is_active TINYINT(1) DEFAULT 1,
    user_agent TEXT DEFAULT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY page_id (page_id),
    KEY visitor_hash (visitor_hash),
    KEY created_at (created_at),
    CONSTRAINT page_engagement_ibfk_1 FOREIGN KEY (page_id) REFERENCES pages (id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Índices adicionais para otimização
CREATE INDEX idx_page_actions_visitor_date ON page_actions (visitor_hash, DATE(created_at));
CREATE INDEX idx_page_engagement_visitor_date ON page_engagement (visitor_hash, DATE(created_at));
CREATE INDEX idx_page_actions_page_action ON page_actions (page_id, action_type);
*/
?>