<?php
date_default_timezone_set('America/Sao_Paulo');


class AtualizadorController
{
    public function index()
    {
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }

        // FORÇAR USUÁRIO ADMIN (SOMENTE PARA TESTE)
        if (!isset($_SESSION['usuario'])) {
            $_SESSION['usuario'] = [
                'id' => 1,
                'nome' => 'Admin Teste',
                'perfil' => 'admin'
            ];
        }

        // Verifica se está logado e é admin
        if ($_SESSION['usuario']['perfil'] !== 'admin') {
            die("Acesso não autorizado.");
        }

        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['arquivo_zip'])) {
            $arquivo = $_FILES['arquivo_zip'];

            // Verifica se é um .zip válido
            if ($arquivo['type'] === 'application/zip' || pathinfo($arquivo['name'], PATHINFO_EXTENSION) === 'zip') {
                $caminho_temporario = $arquivo['tmp_name'];
                $destino = realpath(__DIR__ . '/../../') . DIRECTORY_SEPARATOR; // Raiz do sistema (corrigido)
                $backupBaseDir = $destino . 'backup_atualizacoes';

                // Cria pasta de backup se não existir
                if (!is_dir($backupBaseDir)) {
                    mkdir($backupBaseDir, 0777, true);
                }

                // Cria subpasta com data/hora
                $dataHora = date('Ymd_His');
                $pastaBackup = "$backupBaseDir/backup_$dataHora";
                mkdir($pastaBackup, 0777, true);

                // Caminho do .zip do backup
                $backupZip = "$pastaBackup/sistema_backup_$dataHora.zip";
                $zipBackup = new ZipArchive();
                if ($zipBackup->open($backupZip, ZipArchive::CREATE) === TRUE) {
                    $dir = new RecursiveDirectoryIterator($destino, RecursiveDirectoryIterator::SKIP_DOTS);
                    $files = new RecursiveIteratorIterator($dir);

                    foreach ($files as $file) {
                        $filePath = $file->getRealPath();
                        $relativePath = str_replace($destino, '', $filePath);

                        // Ignora backups antigos
                        if (strpos($relativePath, 'backup_atualizacoes') === false) {
                            $zipBackup->addFile($filePath, $relativePath);
                        }
                    }

                    $zipBackup->close();
                }

                // >>>> SEM VALIDAÇÃO DE ARQUIVOS <<<<
                $zip = new ZipArchive();
                if ($zip->open($caminho_temporario) === TRUE) {
                    $zip->extractTo($destino);
                    $zip->close();
                    $mensagem = "✅ Atualização aplicada com sucesso!";

                    // Gera log
                    $usuario = $_SESSION['usuario']['nome'] ?? 'desconhecido';
                    $logMsg = "[" . date('d/m/Y H:i:s') . "] Atualização realizada por $usuario a partir do arquivo: " . $arquivo['name'] . "\n";
                    file_put_contents($backupBaseDir . '/log_atualizacoes.txt', $logMsg, FILE_APPEND);
                } else {
                    $mensagem = "❌ Falha ao abrir o arquivo ZIP.";
                }
            } else {
                $mensagem = "❌ Arquivo inválido. Envie um arquivo .zip.";
            }
        }

        require_once __DIR__ . '/../Views/atualizador/index.php';
    }

    public function restaurarBackup()
    {
        if (!isset($_SESSION['usuario']) || $_SESSION['usuario']['perfil'] !== 'admin') {
            die("Acesso negado.");
        }

        $arquivo = $_GET['arquivo'] ?? '';
        $backupPath = __DIR__ . '/../../backup_atualizacoes/' . basename($arquivo);

        if (!file_exists($backupPath)) {
            header("Location: " . URL . "/atualizador/restaurar?msg=Backup não encontrado.");
            exit;
        }

        $destino = __DIR__ . '/../../';

        $zip = new ZipArchive();
        if ($zip->open($backupPath) === TRUE) {
            $zip->extractTo($destino);
            $zip->close();
            header("Location: " . URL . "/atualizador/restaurar?msg=Backup restaurado com sucesso!");
        } else {
            header("Location: " . URL . "/atualizador/restaurar?msg=Erro ao restaurar o backup.");
        }
    }

    public function restaurar()
    {
        if (session_status() === PHP_SESSION_NONE) {
            session_start();
        }

        if (!isset($_SESSION['usuario']) || $_SESSION['usuario']['perfil'] !== 'admin') {
            die("Acesso não autorizado.");
        }

        $backupDir = __DIR__ . '/../../backup_atualizacoes/';
        $arquivos = glob($backupDir . 'backup_*/sistema_backup_*.zip');

        // Ordena do mais recente ao mais antigo
        usort($arquivos, function ($a, $b) {
            return filemtime($b) - filemtime($a);
        });

        // Se um backup for escolhido via GET
        if (isset($_GET['file'])) {
            $backup = $_GET['file'];

            if (file_exists($backup)) {
                $zip = new ZipArchive();
                if ($zip->open($backup) === TRUE) {
                    $zip->extractTo(__DIR__ . '/../../');
                    $zip->close();
                    $mensagem = "✅ Backup restaurado com sucesso!";
                } else {
                    $mensagem = "❌ Erro ao restaurar o backup.";
                }
            } else {
                $mensagem = "❌ Arquivo de backup não encontrado.";
            }
        }

        require_once __DIR__ . '/../Views/atualizador/restaurar.php';
    }
}
