<?php
require_once 'config/db.php';
session_start();

if (!isset($_SESSION['mec_authenticated']) || $_SESSION['mec_authenticated'] !== true) {
    http_response_code(401);
    echo json_encode(['error' => 'Não autenticado']);
    exit;
}

$action = $_GET['action'] ?? '';

if ($action === 'get_app_state') {
    $stmt = $pdo->query("SELECT curso_id, state_json FROM curso_state");
    $rows = $stmt->fetchAll();
    
    if (count($rows) === 0) {
        // Retorna null para o app usar o initialState default
        echo json_encode(['courses' => null]);
        exit;
    }

    $courses = [];
    foreach ($rows as $row) {
        $courses[] = json_decode($row['state_json'], true);
    }
    
    echo json_encode(['courses' => $courses]);
    exit;
}

if ($action === 'save_app_state') {
    $data = json_decode(file_get_contents('php://input'), true);
    if (!$data || !isset($data['courses'])) {
        http_response_code(400);
        echo json_encode(['error' => 'Dados inválidos']);
        exit;
    }

    $courses = $data['courses'];
    
    $pdo->beginTransaction();
    try {
        $stmt = $pdo->prepare("INSERT INTO curso_state (curso_id, state_json) VALUES (?, ?) ON DUPLICATE KEY UPDATE state_json = VALUES(state_json)");
        
        foreach ($courses as $index => $course) {
            // Convert id from string ('admin') to an int for db or update schema
            // Wait, schema curso_id is INT. Let's use a mapping: admin=1, procger=2, gestqual=3
            $id_map = ['admin' => 1, 'procger' => 2, 'gestqual' => 3];
            $curso_id = $id_map[$course['id']] ?? ($index + 1);
            $stmt->execute([$curso_id, json_encode($course)]);
        }
        $pdo->commit();
        echo json_encode(['success' => true]);
    } catch (Exception $e) {
        $pdo->rollBack();
        http_response_code(500);
        echo json_encode(['error' => $e->getMessage()]);
    }
    exit;
}

if ($action === 'upload_file') {
    if (!isset($_FILES['file']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK) {
        http_response_code(400);
        echo json_encode(['error' => 'Erro no upload']);
        exit;
    }

    $file = $_FILES['file'];
    $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    
    // Validar extensão se necessário
    
    $new_name = uniqid() . '.' . $ext;
    $upload_dir = 'uploads/';
    
    if (!is_dir($upload_dir)) mkdir($upload_dir, 0755, true);
    
    $dest = $upload_dir . $new_name;
    
    if (move_uploaded_file($file['tmp_name'], $dest)) {
        echo json_encode(['success' => true, 'filename' => $file['name'], 'path' => $dest]);
    } else {
        http_response_code(500);
        echo json_encode(['error' => 'Falha ao mover arquivo']);
    }
    exit;
}

if ($action === 'download_file') {
    // Recupera o path relativo e o nome original do arquivo
    $path     = $_GET['path']     ?? '';
    $filename = $_GET['filename'] ?? '';

    // Segurança: permite apenas arquivos dentro da pasta uploads/
    // Normaliza e verifica que não há path traversal
    $path = ltrim(str_replace(['..', '\\'], ['', '/'], $path), '/');

    if (strpos($path, 'uploads/') !== 0) {
        http_response_code(403);
        echo json_encode(['error' => 'Acesso negado']);
        exit;
    }

    // Caminho absoluto real no servidor
    $base_dir    = realpath(__DIR__);
    $full_path   = $base_dir . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $path);
    $real_path   = realpath($full_path);

    // Verifica que o arquivo existe e está dentro do diretório permitido
    if (!$real_path || strpos($real_path, $base_dir) !== 0 || !is_file($real_path)) {
        http_response_code(404);
        header('Content-Type: application/json');
        echo json_encode(['error' => 'Arquivo não encontrado']);
        exit;
    }

    // Define o nome para download — usa nome original se fornecido
    $download_name = $filename !== '' ? $filename : basename($real_path);
    // Sanitiza o nome para o header
    $download_name = preg_replace('/[^\w\s.\-\(\)áéíóúàèìòùâêîôûãõçÁÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕÇ]/u', '_', $download_name);

    // Detecta MIME type
    $finfo     = finfo_open(FILEINFO_MIME_TYPE);
    $mime_type = finfo_file($finfo, $real_path);
    finfo_close($finfo);
    if (!$mime_type) $mime_type = 'application/octet-stream';

    // Envia o arquivo
    header('Content-Type: ' . $mime_type);
    header('Content-Disposition: attachment; filename="' . $download_name . '"');
    header('Content-Length: ' . filesize($real_path));
    header('Cache-Control: no-cache, no-store, must-revalidate');
    header('Pragma: no-cache');
    header('Expires: 0');
    ob_clean();
    flush();
    readfile($real_path);
    exit;
}

echo json_encode(['error' => 'Ação não encontrada']);
