<?php

/**
 * Script receptor de upload — instalar na VPS em cada pasta de destino.
 *
 * Configuração:
 *   1. Copie este arquivo para cada pasta de destino na VPS.
 *   2. Altere SECRET_TOKEN para o mesmo valor configurado no app local.
 *   3. Garanta permissão de escrita: chown www-data:www-data <pasta>
 *
 * Exemplo de instalação:
 *   cp upload_receiver.php /var/www/html/pasta1/
 *   nano /var/www/html/pasta1/upload_receiver.php   # edite SECRET_TOKEN
 */

define('SECRET_TOKEN', 'RoJsmrSftX6SpdXGAK5M1GAvgRgyeoQsqljfHfBQ');

define('UPLOAD_DIR', __DIR__ . DIRECTORY_SEPARATOR);

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

// Bloqueia acesso direto pelo navegador sem token
$token = $_SERVER['HTTP_X_UPLOAD_TOKEN'] ?? '';
if ($token === '' || $token !== SECRET_TOKEN) {
    http_response_code(403);
    echo json_encode(['success' => false, 'message' => 'Acesso negado: token inválido ou ausente.']);
    exit;
}

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

if (!isset($_FILES['file'])) {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Nenhum arquivo recebido.']);
    exit;
}

$uploadError = $_FILES['file']['error'];
if ($uploadError !== UPLOAD_ERR_OK) {
    $msgs = [
        UPLOAD_ERR_INI_SIZE   => 'Arquivo excede upload_max_filesize no php.ini da VPS.',
        UPLOAD_ERR_FORM_SIZE  => 'Arquivo excede MAX_FILE_SIZE.',
        UPLOAD_ERR_PARTIAL    => 'Upload parcial.',
        UPLOAD_ERR_NO_FILE    => 'Nenhum arquivo enviado.',
        UPLOAD_ERR_NO_TMP_DIR => 'Pasta temporária não encontrada.',
        UPLOAD_ERR_CANT_WRITE => 'Falha ao escrever no disco.',
        UPLOAD_ERR_EXTENSION  => 'Upload bloqueado por extensão PHP.',
    ];
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => $msgs[$uploadError] ?? "Erro de upload ({$uploadError})."]);
    exit;
}

// Sanitiza o nome do arquivo para evitar path traversal
$originalName = basename($_FILES['file']['name']);
$safeName     = preg_replace('/[^a-zA-Z0-9._\-]/', '_', $originalName);

if ($safeName === '' || $safeName === '.') {
    http_response_code(400);
    echo json_encode(['success' => false, 'message' => 'Nome de arquivo inválido.']);
    exit;
}

$destination = UPLOAD_DIR . $safeName;

// ── Backup da versão anterior (mantém apenas as 3 últimas) ──
if (file_exists($destination)) {
    $backupDir = UPLOAD_DIR . '_versoes_anteriores' . DIRECTORY_SEPARATOR;
    if (!is_dir($backupDir)) {
        @mkdir($backupDir, 0755, true);
    }

    $backupName = $safeName . '.' . date('Y-m-d_H-i-s');
    @copy($destination, $backupDir . $backupName);

    // Lista backups deste arquivo ordenados do mais antigo ao mais novo
    $pattern = $backupDir . $safeName . '.*';
    $existing = glob($pattern);
    if ($existing !== false) {
        sort($existing); // ordem crescente = mais antigo primeiro
        while (count($existing) > 3) {
            @unlink(array_shift($existing));
        }
    }
}

// ── Escrita atômica: tmp → rename ────────────────────
// O arquivo antigo permanece online até o novo estar 100% escrito.
$tmpDest = UPLOAD_DIR . '.' . $safeName . '.tmp_' . uniqid('', true);

if (!move_uploaded_file($_FILES['file']['tmp_name'], $tmpDest)) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Falha ao escrever arquivo temporário. Verifique permissões da pasta.']);
    exit;
}

if (!rename($tmpDest, $destination)) {
    @unlink($tmpDest);
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => 'Falha ao mover arquivo para destino final.']);
    exit;
}

echo json_encode([
    'success' => true,
    'message' => "Arquivo '{$safeName}' recebido com sucesso.",
]);
