<?php
/**
 * API: Gerenciar Progresso de Aulas
 * Endpoint para marcar/desmarcar aula como concluída
 * 
 * @version 1.0
 * @author Checkout Pro 2025
 */

header('Content-Type: application/json; charset=utf-8');

// Autenticação
require_once __DIR__ . '/../auth_helper.php';
requer_usuario();

// Conexão com banco
require_once __DIR__ . '/../../config/config_db.php';

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

$usuario_logado = usuario_logado();
$usuario_id = $usuario_logado['id'];

// Dados recebidos
$aula_id = isset($_POST['aula_id']) ? intval($_POST['aula_id']) : 0;
$produto_id = isset($_POST['produto_id']) ? intval($_POST['produto_id']) : 0;
$action = isset($_POST['action']) ? $_POST['action'] : 'complete';

if ($aula_id <= 0) {
    http_response_code(400);
    echo json_encode(['status' => 'error', 'message' => 'ID da aula inválido']);
    exit;
}

try {
    // Validar se o usuário tem acesso ao produto desta aula
    if ($produto_id > 0) {
        $sql_matricula = "SELECT id FROM matriculas 
                          WHERE usuario_id = :usuario_id 
                          AND produto_id = :produto_id 
                          AND status = 'ativo'
                          AND (data_expiracao IS NULL OR data_expiracao >= NOW())";
        $stmt_matricula = $pdo->prepare($sql_matricula);
        $stmt_matricula->execute([
            ':usuario_id' => $usuario_id,
            ':produto_id' => $produto_id
        ]);
        $matricula = $stmt_matricula->fetch(PDO::FETCH_ASSOC);
        
        if (!$matricula) {
            http_response_code(403);
            echo json_encode(['status' => 'error', 'message' => 'Acesso negado ao curso']);
            exit;
        }
    }

    // Verificar se a aula existe
    $sql_aula = "SELECT a.*, m.produto_id 
                 FROM aulas a
                 INNER JOIN modulos m ON m.id = a.modulo_id
                 WHERE a.id = :aula_id";
    $stmt_aula = $pdo->prepare($sql_aula);
    $stmt_aula->execute([':aula_id' => $aula_id]);
    $aula = $stmt_aula->fetch(PDO::FETCH_ASSOC);
    
    if (!$aula) {
        http_response_code(404);
        echo json_encode(['status' => 'error', 'message' => 'Aula não encontrada']);
        exit;
    }

    // Validar matrícula se produto_id não foi fornecido
    if ($produto_id <= 0) {
        $produto_id = $aula['produto_id'];
        $sql_matricula = "SELECT id FROM matriculas 
                          WHERE usuario_id = :usuario_id 
                          AND produto_id = :produto_id 
                          AND status = 'ativo'
                          AND (data_expiracao IS NULL OR data_expiracao >= NOW())";
        $stmt_matricula = $pdo->prepare($sql_matricula);
        $stmt_matricula->execute([
            ':usuario_id' => $usuario_id,
            ':produto_id' => $produto_id
        ]);
        $matricula = $stmt_matricula->fetch(PDO::FETCH_ASSOC);
        
        if (!$matricula) {
            http_response_code(403);
            echo json_encode(['status' => 'error', 'message' => 'Acesso negado ao curso']);
            exit;
        }
    }

    // Processar ação
    if ($action === 'complete') {
        // Marcar como concluída
        $sql_insert = "INSERT INTO progresso_aulas (usuario_id, aula_id, concluida, data_conclusao, created_at, updated_at)
                       VALUES (:usuario_id, :aula_id, 1, NOW(), NOW(), NOW())
                       ON DUPLICATE KEY UPDATE 
                       concluida = 1, 
                       data_conclusao = NOW(), 
                       updated_at = NOW()";
        $stmt_insert = $pdo->prepare($sql_insert);
        $stmt_insert->execute([
            ':usuario_id' => $usuario_id,
            ':aula_id' => $aula_id
        ]);
    } else {
        // Desmarcar como concluída
        $sql_update = "UPDATE progresso_aulas 
                       SET concluida = 0, 
                           data_conclusao = NULL, 
                           updated_at = NOW()
                       WHERE usuario_id = :usuario_id 
                       AND aula_id = :aula_id";
        $stmt_update = $pdo->prepare($sql_update);
        $stmt_update->execute([
            ':usuario_id' => $usuario_id,
            ':aula_id' => $aula_id
        ]);
    }

    // Calcular novo progresso
    $sql_total = "SELECT COUNT(*) as total 
                  FROM aulas a
                  INNER JOIN modulos m ON m.id = a.modulo_id
                  WHERE m.produto_id = :produto_id";
    $stmt_total = $pdo->prepare($sql_total);
    $stmt_total->execute([':produto_id' => $produto_id]);
    $total = $stmt_total->fetch(PDO::FETCH_ASSOC)['total'];

    $sql_concluidas = "SELECT COUNT(DISTINCT pa.aula_id) as concluidas
                       FROM progresso_aulas pa
                       INNER JOIN aulas a ON a.id = pa.aula_id
                       INNER JOIN modulos m ON m.id = a.modulo_id
                       WHERE pa.usuario_id = :usuario_id
                       AND m.produto_id = :produto_id
                       AND pa.concluida = 1";
    $stmt_concluidas = $pdo->prepare($sql_concluidas);
    $stmt_concluidas->execute([
        ':usuario_id' => $usuario_id,
        ':produto_id' => $produto_id
    ]);
    $concluidas = $stmt_concluidas->fetch(PDO::FETCH_ASSOC)['concluidas'];

    $percentual = $total > 0 ? ($concluidas / $total) * 100 : 0;

    // Buscar próxima aula (se concluiu)
    $aula_proxima = null;
    if ($action === 'complete') {
        $sql_proxima = "SELECT a.id, a.titulo, m.produto_id
                        FROM aulas a
                        INNER JOIN modulos m ON m.id = a.modulo_id
                        WHERE m.produto_id = :produto_id
                        AND a.id > :aula_id
                        ORDER BY m.ordem ASC, a.ordem ASC
                        LIMIT 1";
        $stmt_proxima = $pdo->prepare($sql_proxima);
        $stmt_proxima->execute([
            ':produto_id' => $produto_id,
            ':aula_id' => $aula_id
        ]);
        $aula_proxima = $stmt_proxima->fetch(PDO::FETCH_ASSOC);
    }

    // Resposta
    echo json_encode([
        'status' => 'success',
        'message' => $action === 'complete' ? 'Aula marcada como concluída' : 'Aula desmarcada como concluída',
        'progresso' => [
            'concluidas' => intval($concluidas),
            'total' => intval($total),
            'percentual' => round($percentual, 2)
        ],
        'aula_proxima' => $aula_proxima
    ]);

} catch (PDOException $e) {
    error_log("Erro ao atualizar progresso: " . $e->getMessage());
    http_response_code(500);
    echo json_encode(['status' => 'error', 'message' => 'Erro ao atualizar progresso']);
}





