<?php
/**
 * Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
 * (parte do Premium Express BI - Fire Sistemas)
 *
 * Rastreador de Ruptura — Reposição Urgente.
 * O que comprar AGORA pra não perder venda: SKUs zerados que vendem +
 * itens abaixo do mínimo com saída recente.
 *
 * Toda a lógica pesada (giro, lead time, fornecedor, urgência, sugestão)
 * é reusada de SugestaoCompraRepository::sugestao() — esta tela só recorta,
 * enriquece com marca e monta KPIs/rankings.
 */

namespace App\Controllers;

use App\Core\Database;
use App\Core\Lojas;
use App\Core\View;
use App\Repositories\SugestaoCompraRepository;

class RupturaController
{
    private function repo(): SugestaoCompraRepository
    {
        $emp = 5;
        try { $emp = (int) Lojas::codEmpresaAtiva(); } catch (\Throwable) {
            $cfg = $this->config(); $emp = (int)($cfg['cod_empresa'] ?? 5);
        }
        return new SugestaoCompraRepository(Database::conectar(), $emp ?: 5);
    }

    private function config(): array
    {
        $p = dirname(__DIR__, 2) . '/config/database.php';
        return file_exists($p) ? (require $p) : [];
    }

    private function guardaConexao(): void
    {
        if (!Database::estaConfigurado()) { header('Location: /configurar'); exit; }
    }

    /** Datas: padrão = últimos 30 dias até a última venda. */
    private function parseDatas(string $ultima): array
    {
        $padraoIni = date('Y-m-d', strtotime($ultima . ' -29 days'));
        $ini = $_GET['data_ini'] ?? $padraoIni;
        $fim = $_GET['data_fim'] ?? $ultima;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $ini)) $ini = $padraoIni;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $fim)) $fim = $ultima;
        if ($fim < $ini) $fim = $ini;
        return [$ini, $fim];
    }

    /** GET /compras/ruptura — shell instantâneo, dados via /api/compras/ruptura */
    public function index(): void
    {
        $this->guardaConexao();
        $config = $this->config();
        View::render('compras/ruptura', [
            'titulo'   => 'Rastreador de Ruptura — Premium Express Gestão',
            'config'   => $config,
            'segmento' => Lojas::resolverSegmento($config),
            'ano'      => date('Y'),
        ]);
    }

    /** GET /api/compras/ruptura
     *
     * Blindagem 24/06/2026: zera buffer, sobe memory_limit, e registra um
     * shutdown handler que devolve JSON limpo se um E_ERROR (memória,
     * timeout, parse error) matar o processo no meio. Antes desse fix, um
     * Fatal de memória cuspia HTML por cima do JSON parcial e o front
     * estourava "Unexpected token '<'".
     */
    public function dadosApi(): void
    {
        // Paliativo imediato pra catálogo grande (Real Prime tem dezenas de
        // milhares de SKUs históricos). O fix de verdade está no mapaMarca
        // escopado por COD_ITEM, mas garantimos folga aqui também.
        @ini_set('memory_limit', '512M');
        @ini_set('display_errors', '0');

        // Zera qualquer buffer que possa ter sido aberto antes (output cap).
        while (ob_get_level() > 0) { @ob_end_clean(); }
        ob_start();

        // Shutdown handler: se um E_ERROR matar o processo no meio do echo,
        // ainda devolvemos JSON 500 limpo (não HTML).
        register_shutdown_function(function () {
            $err = error_get_last();
            if (!$err) return;
            $fatais = E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR;
            if (!($err['type'] & $fatais)) return;
            // Limpa o que estava no buffer (provavelmente JSON pela metade + HTML do erro)
            while (ob_get_level() > 0) { @ob_end_clean(); }
            if (!headers_sent()) {
                http_response_code(500);
                header('Content-Type: application/json; charset=utf-8');
            }
            echo json_encode([
                'ok'              => false,
                'erro'            => 'Erro interno ao gerar Ruptura (' . $err['type'] . ').',
                'detalhe'         => $err['message'] ?? '',
                'kpis'            => [],
                'linhas'          => [],
                'topVendaPerdida' => [],
                'porMarca'        => [],
            ], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        });

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

        try {
            $repo   = $this->repo();
            $ultima = $repo->ultimaData();
            [$ini, $fim] = $this->parseDatas($ultima);
            $g = $_GET;
            $f = [
                'data_ini'    => $ini,
                'data_fim'    => $fim,
                'cobertura'   => $g['cobertura']   ?? 30,
                'lead_padrao' => $g['lead_padrao'] ?? 7,
            ];
            $d = $repo->dadosRuptura($f);
            // Limpa qualquer warning/notice que tenha vazado antes do echo
            if (ob_get_length() !== false) { @ob_clean(); }
            echo json_encode($d, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        } catch (\Throwable $e) {
            if (ob_get_length() !== false) { @ob_clean(); }
            http_response_code(500);
            echo json_encode([
                'ok'              => false,
                'erro'            => $e->getMessage(),
                'kpis'            => [],
                'linhas'          => [],
                'topVendaPerdida' => [],
                'porMarca'        => [],
            ], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        }
        // Flush controlado
        while (ob_get_level() > 0) { @ob_end_flush(); }
        exit;
    }
}
