<?php
require_once __DIR__ . '/../core/db_helper.php';
require_once __DIR__ . '/../core/auth.php';

$usuarioLogado = exigir_nivel(['ADM']);
$acao = $_GET['acao'] ?? 'gerar';

if ($acao === 'gerar_local') {
    // Salva o backup DENTRO da hospedagem (pasta backups/), sem forçar
    // download — útil pro botão "Gerar backup agora" e pro cron automático.
    header('Content-Type: application/json; charset=utf-8');
    $r = gerar_backup_local();
    if ($r['ok']) {
        auditoria_log($usuarioLogado['usuario'], 'BACKUP_LOCAL_GERADO', $r['arquivo']);
    }
    echo json_encode($r, JSON_UNESCAPED_UNICODE);
    exit;
}

if ($acao === 'listar_local') {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(['ok' => true, 'backups' => listar_backups_locais()], JSON_UNESCAPED_UNICODE);
    exit;
}

if ($acao === 'baixar_local') {
    $nome = $_GET['arquivo'] ?? '';
    if (!preg_match('/^backup_cobranex_[0-9_\-]+\.zip$/', $nome)) {
        http_response_code(422);
        exit('Nome de arquivo inválido.');
    }
    $caminho = BACKUPS_PATH . '/' . $nome;
    if (!file_exists($caminho)) {
        http_response_code(404);
        exit('Backup não encontrado.');
    }
    auditoria_log($usuarioLogado['usuario'], 'BACKUP_LOCAL_BAIXADO', $nome);
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . $nome . '"');
    header('Content-Length: ' . filesize($caminho));
    readfile($caminho);
    exit;
}

if ($acao === 'excluir_local') {
    header('Content-Type: application/json; charset=utf-8');
    $corpo = json_decode(file_get_contents('php://input'), true) ?? $_POST;
    $nome = $corpo['arquivo'] ?? '';
    if (!preg_match('/^backup_cobranex_[0-9_\-]+\.zip$/', $nome)) {
        http_response_code(422);
        echo json_encode(['ok' => false, 'erro' => 'Nome de arquivo inválido.']);
        exit;
    }
    $caminho = BACKUPS_PATH . '/' . $nome;
    if (file_exists($caminho)) {
        unlink($caminho);
    }
    auditoria_log($usuarioLogado['usuario'], 'BACKUP_LOCAL_EXCLUIDO', $nome);
    echo json_encode(['ok' => true], JSON_UNESCAPED_UNICODE);
    exit;
}

if ($acao === 'gerar') {
    $zipPath = sys_get_temp_dir() . '/backup_nexus_' . date('Y-m-d_His') . '.zip';
    $zip = new ZipArchive();
    $zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE);
    foreach (glob(DB_PATH . '/*.json') as $arquivo) {
        $zip->addFile($arquivo, basename($arquivo));
    }
    $zip->close();

    auditoria_log($usuarioLogado['usuario'], 'BACKUP_GERADO', basename($zipPath));

    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . basename($zipPath) . '"');
    header('Content-Length: ' . filesize($zipPath));
    readfile($zipPath);
    @unlink($zipPath);
    exit;
}

if ($acao === 'restaurar') {
    header('Content-Type: application/json; charset=utf-8');
    if (empty($_FILES['arquivo']['tmp_name'])) {
        http_response_code(422);
        echo json_encode(['ok' => false, 'erro' => 'Nenhum arquivo enviado.']);
        exit;
    }

    $zip = new ZipArchive();
    if ($zip->open($_FILES['arquivo']['tmp_name']) !== true) {
        http_response_code(422);
        echo json_encode(['ok' => false, 'erro' => 'Arquivo ZIP inválido.']);
        exit;
    }

    // Antes usava uma lista fixa de nomes, que ficava desatualizada sempre
    // que um novo arquivo (ex: planos.json) era adicionado ao sistema.
    // Agora aceitamos qualquer nome de arquivo .json "seguro" (sem barras,
    // sem "..", só letras/números/underscore), o que cobre automaticamente
    // qualquer arquivo novo que o sistema passe a usar no futuro.
    $restaurados = [];
    $ignorados = [];
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $nome = $zip->getNameIndex($i);
        if (!preg_match('/^[a-zA-Z0-9_\-]+\.json$/', $nome)) {
            $ignorados[] = $nome;
            continue;
        }
        $conteudo = $zip->getFromIndex($i);
        if (json_decode($conteudo) !== null) {
            file_put_contents(DB_PATH . '/' . $nome, $conteudo);
            $restaurados[] = $nome;
        } else {
            $ignorados[] = $nome;
        }
    }
    $zip->close();

    auditoria_log($usuarioLogado['usuario'], 'BACKUP_RESTAURADO', implode(',', $restaurados));
    echo json_encode(['ok' => true, 'restaurados' => $restaurados, 'ignorados' => $ignorados]);
    exit;
}

http_response_code(400);
echo json_encode(['ok' => false, 'erro' => 'Ação inválida.']);
