<?php
// Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva

namespace App\Controllers;

use App\Core\Database;
use App\Core\View;
use App\Repositories\CozinhaRepository;

class CozinhaController
{
    private function repo(): CozinhaRepository
    {
        return new CozinhaRepository(Database::conectar());
    }

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

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

    /**
     * Controle de acesso passa pelo Gerenciador de Usuários — permissão 'cozinha'.
     * O auth middleware do index.php (FbAuth::moduloDaUri -> guardModulo) já
     * faz isso automaticamente. Este método foi retirado.
     */
    private function guardaSegmento(): void
    {
        // intencionalmente vazio — mantido como no-op pra compat com chamadas existentes
    }

    private function parseDatas(string $ultimaFallback): array
    {
        $dataIni = $_GET['data_ini'] ?? date('Y-m-d', strtotime($ultimaFallback . ' -29 days'));
        $dataFim = $_GET['data_fim'] ?? $ultimaFallback;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataIni)) $dataIni = date('Y-m-d', strtotime($ultimaFallback . ' -29 days'));
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataFim))  $dataFim = $ultimaFallback;
        if ($dataFim < $dataIni) $dataFim = $dataIni;
        return [$dataIni, $dataFim];
    }

    // ════════════════════════════════════════════════════════════════════════
    //  PÁGINAS
    // ════════════════════════════════════════════════════════════════════════

    /** GET /cozinha — tela tablet (kiosk dark) */
    public function tablet(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        $config = $this->config();
        $cfgKds = $this->repo()->carregarConfig();

        // Tela kiosk: sem layout master (sem sidebar, sem topbar)
        View::render('cozinha/tablet', [
            'titulo'   => 'Painel da Cozinha — Premium Express Gestão',
            'config'   => $config,
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'cfg_kds'  => $cfgKds,
            'ano'      => date('Y'),
        ], '');
    }

    /** GET /cozinha/relatorio — visão gerente (standalone, sem chrome do BI) */
    public function relatorio(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        $config = $this->config();
        $hoje   = date('Y-m-d');
        $defaultIni = date('Y-m-d', strtotime('-29 days'));

        $dataIni = $_GET['data_ini'] ?? $defaultIni;
        $dataFim = $_GET['data_fim'] ?? $hoje;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataIni)) $dataIni = $defaultIni;
        if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $dataFim))  $dataFim = $hoje;

        // Standalone: sem layout master do BI (Cozinha eh app separado)
        View::render('cozinha/relatorio', [
            'titulo'   => 'Tempo de Preparo — Cozinha',
            'config'   => $config,
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'filtros'  => ['dataIni' => $dataIni, 'dataFim' => $dataFim],
            'ano'      => date('Y'),
        ], '');
    }

    /** GET /cozinha/menu — tela inicial com cards das opções (gerente) */
    public function menu(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        $config = $this->config();

        View::render('cozinha/menu', [
            'titulo'   => 'Início — Cozinha',
            'config'   => $config,
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'ano'      => date('Y'),
        ], '');
    }

    /** GET /cozinha/links — central de URLs com QR Code (standalone) */
    public function links(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        $config = $this->config();

        View::render('cozinha/links', [
            'titulo'   => 'Links e Endereços — Cozinha',
            'config'   => $config,
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'ano'      => date('Y'),
        ], '');
    }

    /** GET /cozinha/config — escolher grupos da cozinha (standalone) */
    public function configuracoes(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        $config = $this->config();
        $cfgKds = $this->repo()->carregarConfig();

        View::render('cozinha/config', [
            'titulo'   => 'Configurar Cozinha',
            'config'   => $config,
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'cfg_kds'  => $cfgKds,
            'ano'      => date('Y'),
        ], '');
    }

    // ════════════════════════════════════════════════════════════════════════
    //  APIs JSON
    // ════════════════════════════════════════════════════════════════════════

    /** GET /api/cozinha/fila */
    public function filaApi(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $repo   = $this->repo();
            $fila   = $repo->fila();
            $cfg    = $repo->carregarConfig();
            echo json_encode([
                'fila'    => $fila,
                'config'  => $cfg,
                'agora'   => date('Y-m-d H:i:s'),
            ], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()], JSON_UNESCAPED_UNICODE);
        }
        exit;
    }

    /** POST /api/cozinha/finalizar — body: cod_empresa, cod_abertura, cod_lanc */
    public function finalizarApi(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $body = $this->parseJsonBody();
            $codEmpresa  = (int)($body['cod_empresa']  ?? 0);
            $codAbertura = (int)($body['cod_abertura'] ?? 0);
            $codLanc     = (int)($body['cod_lanc']     ?? 0);

            if ($codEmpresa <= 0 || $codAbertura <= 0 || $codLanc <= 0) {
                http_response_code(400);
                echo json_encode(['erro' => 'cod_empresa, cod_abertura e cod_lanc obrigatórios']);
                exit;
            }

            $res = $this->repo()->finalizar($codEmpresa, $codAbertura, $codLanc);
            echo json_encode($res, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()], JSON_UNESCAPED_UNICODE);
        }
        exit;
    }

    /** GET /cozinha/meu — celular pessoal do garçom (filtrado por nome dele) */
    public function meu(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        $config = $this->config();

        $garcomNome = trim((string)($_GET['garcom'] ?? ''));

        View::render('cozinha/meu', [
            'titulo'     => 'Meus Pedidos — ' . ($garcomNome ?: 'Garçom'),
            'config'     => $config,
            'segmento'   => \App\Core\Lojas::resolverSegmento($config),
            'garcomNome' => $garcomNome,
            'ano'        => date('Y'),
        ], '');
    }

    /** GET /cozinha/avisos — tela TV/tablet do balcão, garçom vê pratos prontos */
    public function avisos(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        $config = $this->config();

        View::render('cozinha/avisos', [
            'titulo'   => 'Avisos de Pratos Prontos — Cozinha',
            'config'   => $config,
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'ano'      => date('Y'),
        ], '');
    }

    /** GET /api/cozinha/avisos-pendentes — JSON pra display do garçom */
    public function avisosApi(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $avisos = $this->repo()->avisosPendentes(10);
            echo json_encode([
                'avisos' => $avisos,
                'agora'  => date('Y-m-d H:i:s'),
            ], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()], JSON_UNESCAPED_UNICODE);
        }
        exit;
    }

    /** POST /api/cozinha/marcar-retirado — garçom passou no balcão e levou */
    public function marcarRetiradoApi(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $body = $this->parseJsonBody();
            $codEmpresa  = (int)($body['cod_empresa']  ?? 0);
            $codAbertura = (int)($body['cod_abertura'] ?? 0);
            $codLanc     = (int)($body['cod_lanc']     ?? 0);
            $retiradoPor = (string)($body['retirado_por'] ?? '');
            $res = $this->repo()->marcarRetirado($codEmpresa, $codAbertura, $codLanc, $retiradoPor);
            echo json_encode($res, JSON_UNESCAPED_UNICODE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()]);
        }
        exit;
    }

    /** GET /api/cozinha/garcons — lista garcons ativos pra modal Retirei */
    public function garconsApi(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $garcons = $this->repo()->listarGarcons();
            echo json_encode(['garcons' => $garcons], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()]);
        }
        exit;
    }

    /** POST /api/cozinha/desfazer */
    public function desfazerApi(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $body = $this->parseJsonBody();
            $codEmpresa  = (int)($body['cod_empresa']  ?? 0);
            $codAbertura = (int)($body['cod_abertura'] ?? 0);
            $codLanc     = (int)($body['cod_lanc']     ?? 0);
            $res = $this->repo()->desfazer($codEmpresa, $codAbertura, $codLanc);
            echo json_encode($res, JSON_UNESCAPED_UNICODE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()]);
        }
        exit;
    }

    /** GET /api/cozinha/relatorio */
    public function relatorioApi(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $hoje = date('Y-m-d');
            [$dataIni, $dataFim] = $this->parseDatas($hoje);
            $res = $this->repo()->relatorio($dataIni, $dataFim);
            echo json_encode($res, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()]);
        }
        exit;
    }

    /** GET /api/cozinha/destinos — lista COD_IMPRESSAO do ERP com qtd lanc */
    public function destinosApi(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $config = $this->config();
            $codEmpresa = (int)($config['cod_empresa'] ?? 1);
            $destinos = $this->repo()->listarDestinos($codEmpresa);
            $cfgKds = $this->repo()->carregarConfig();
            echo json_encode([
                'destinos' => $destinos,
                'config'   => $cfgKds,
            ], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()]);
        }
        exit;
    }

    /** GET /api/cozinha/grupos — pra tela de config */
    public function gruposApi(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $config = $this->config();
            $codEmpresa = (int)($config['cod_empresa'] ?? 1);
            $grupos = $this->repo()->listarGrupos($codEmpresa);
            $cfgKds = $this->repo()->carregarConfig();
            echo json_encode([
                'grupos' => $grupos,
                'config' => $cfgKds,
            ], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()]);
        }
        exit;
    }

    /** POST /api/cozinha/config — salva preferências da cozinha */
    public function salvarConfigApi(): void
    {
        $this->guardaConexao();
        $this->guardaSegmento();
        header('Content-Type: application/json; charset=utf-8');
        try {
            $body = $this->parseJsonBody();
            $repo = $this->repo();
            $atual = $repo->carregarConfig();

            $novo = $atual;
            if (isset($body['grupos_ativos']) && is_array($body['grupos_ativos'])) {
                $novo['grupos_ativos'] = array_values(array_map('strval', $body['grupos_ativos']));
            }
            if (isset($body['usa_whitelist']))    $novo['usa_whitelist']    = (bool)$body['usa_whitelist'];
            if (isset($body['polling_segundos'])) $novo['polling_segundos'] = max(3, (int)$body['polling_segundos']);
            if (isset($body['amarelo_min']))      $novo['amarelo_min']      = max(1, (int)$body['amarelo_min']);
            if (isset($body['vermelho_min']))     $novo['vermelho_min']     = max((int)$novo['amarelo_min'] + 1, (int)$body['vermelho_min']);
            if (isset($body['esquecido_min']))    $novo['esquecido_min']    = max((int)$novo['vermelho_min'] + 1, (int)$body['esquecido_min']);
            if (isset($body['cod_impressoes']) && is_array($body['cod_impressoes'])) {
                $novo['cod_impressoes'] = array_values(array_filter(array_map('intval', $body['cod_impressoes'])));
            }

            $repo->salvarConfig($novo);
            echo json_encode(['ok' => true, 'config' => $novo], JSON_UNESCAPED_UNICODE);
        } catch (\Throwable $e) {
            http_response_code(500);
            echo json_encode(['erro' => $e->getMessage()]);
        }
        exit;
    }

    private function parseJsonBody(): array
    {
        $raw = (string)file_get_contents('php://input');
        if ($raw === '') return $_POST;
        $data = json_decode($raw, true);
        return is_array($data) ? $data : [];
    }
}
