<?php

namespace App\Controllers;

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

/**
 * Sugestão de Compra — o que repor e quanto (giro/mínimo/ruptura/lead time).
 * Shell instantâneo; núcleo via /api/compras/sugestao; fornecedor+lead em 2º plano (com_fornecedor=1).
 */
class SugestaoCompraController
{
    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 a partir da ú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];
    }

    public function index(): void
    {
        $this->guardaConexao();
        $config = $this->config();
        View::render('compras/sugestao', [
            'titulo'   => 'Sugestão de Compra — Premium Express Gestão',
            'config'   => $config,
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'ano'      => date('Y'),
        ]);
    }

    /** GET /api/compras/sugestao */
    public function dadosApi(): void
    {
        $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,
                'apenas'           => $g['apenas']      ?? '',
                'incluir_sem_venda'=> !isset($g['incluir_sem_venda']) || $g['incluir_sem_venda'] !== '0',
                'ordenar'          => $g['ordenar']     ?? 'urgencia',
                'limite'           => $g['limite']      ?? 1000,
                'com_fornecedor'   => !empty($g['com_fornecedor']),
                'usar_lead'        => !isset($g['usar_lead']) || $g['usar_lead'] !== '0',
                'forn_ini'         => $g['forn_ini']    ?? '',
                'forn_fim'         => $g['forn_fim']    ?? '',
            ];
            echo json_encode($repo->sugestao($f), JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        }
        exit;
    }

    /**
     * GET /api/compras/sugestao/ruptura-count
     * Endpoint enxuto pra alimentar o badge na sidebar (chamado em TODA
     * requisição de página). Resposta cacheada 5 min no repo.
     *
     * Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
     */
    public function rupturaCountApi(): void
    {
        header('Content-Type: application/json; charset=utf-8');
        try {
            if (!\App\Core\Database::estaConfigurado()) {
                echo json_encode(['ruptura' => 0]); exit;
            }
            $n = $this->repo()->rupturaCount();
            echo json_encode(['ruptura' => $n]);
        } catch (\Throwable) {
            echo json_encode(['ruptura' => 0]);
        }
        exit;
    }
}
