<?php
// Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
// API que recebe heartbeats dos BIs clientes (Real Prime, Importados, etc).
// Cada BI manda POST com status do ultimo backup.
//
// Instalar: copiar este arquivo + index.php pra C:\Fire-Updates\public\painel-backups\
// no servidor 24h. Acessar via http://177.23.184.123:8084/painel-backups/

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

$cfgFile = __DIR__ . '/config.php';
if (!is_file($cfgFile)) {
    http_response_code(500);
    echo json_encode(['ok'=>false, 'erro'=>'config.php não criado no servidor']);
    exit;
}
$cfg = include $cfgFile;

// Valida token compartilhado
$tokenRecebido = $_SERVER['HTTP_X_TOKEN'] ?? ($_POST['token'] ?? '');
if ($tokenRecebido !== ($cfg['token'] ?? '')) {
    http_response_code(403);
    echo json_encode(['ok'=>false, 'erro'=>'token inválido']);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['ok'=>false, 'erro'=>'use POST']);
    exit;
}

// Le body JSON
$raw = file_get_contents('php://input');
$body = @json_decode($raw, true);
if (!is_array($body)) {
    http_response_code(400);
    echo json_encode(['ok'=>false, 'erro'=>'JSON inválido']);
    exit;
}

// Tipo do payload — backup (default) ou atualizacao (v1.5.35+)
$tipo = (string)($body['tipo'] ?? 'backup');
$dirStorage = __DIR__ . '/storage';
if (!is_dir($dirStorage)) @mkdir($dirStorage, 0777, true);
$host = preg_replace('/[^a-zA-Z0-9_-]/', '', (string)($body['host_cliente'] ?? $body['hostname'] ?? 'unk'));

// ATUALIZACOES (Logger do BI cliente apos rodar OTA) — vao pra arquivo separado
// em append (.jsonl), pra eu poder ver historico sem precisar PowerShell.
// IMPORTANTE: validado antes da checagem de cliente/job_id (atualizacao nao tem isso).
if ($tipo === 'atualizacao') {
    $dirAtu = $dirStorage . '/atualizacoes';
    if (!is_dir($dirAtu)) @mkdir($dirAtu, 0777, true);

    $body['ip_remoto']   = $_SERVER['REMOTE_ADDR'] ?? '?';
    $body['recebido_em'] = date('c');

    $arqAtu = $dirAtu . '/' . ($host !== '' ? $host : 'unk') . '.jsonl';
    @file_put_contents($arqAtu, json_encode($body, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE) . "\n", FILE_APPEND);
    echo json_encode(['ok'=>true, 'tipo'=>'atualizacao', 'salvo'=>basename($arqAtu)]);
    exit;
}

// BACKUP (fluxo legado): valida campos obrigatorios
$cliente = trim((string)($body['cliente'] ?? ''));
$jobId   = trim((string)($body['job_id'] ?? ''));
if ($cliente === '' || $jobId === '') {
    http_response_code(400);
    echo json_encode(['ok'=>false, 'erro'=>'cliente e job_id são obrigatórios']);
    exit;
}

$slug = preg_replace('/[^a-zA-Z0-9_-]/', '', $jobId);
$arq = $dirStorage . '/' . $host . '__' . $slug . '.json';

// Enriquece com IP do remoto e momento de recepcao
$body['ip_remoto']      = $_SERVER['REMOTE_ADDR'] ?? '?';
$body['recebido_em']    = date('c');

// Heartbeat de backup em andamento (v1.5.25+):
// Quando status='em_andamento' o payload TRAZ tambem: estagio, tamanho_atual,
// iniciado_em, tempo_decorrido. Sobrescreve o mesmo arquivo do job (=mesmo
// padrao do payload final sucesso/falha) — index.php diferencia pelo campo
// 'status' e mostra bolinha azul pulsante quando heartbeat < 90s.

@file_put_contents($arq, json_encode($body, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

echo json_encode(['ok'=>true, 'salvo'=>basename($arq)]);
