<?php
// Depto de Engenharia e Automacao - Master Automacao - Autor: Derlivon Silva

namespace App\Controllers;

use App\Core\Database;
use App\Core\View;

/**
 * Configuração: códigos de operação que devem contar como venda no BI.
 *
 * Grava/le em config/database.php sob a chave 'tipos_venda_extras' (array de inteiros).
 * Quando o usuário salva, faz backup do database.php, reescreve o arquivo
 * preservando a estrutura var_export e limpa o cache JSON do BI.
 */
class TiposVendaController
{
    private function configPath(): string
    {
        return dirname(__DIR__, 2) . '/config/database.php';
    }

    private function config(): array
    {
        $path = $this->configPath();
        return file_exists($path) ? (require $path) : [];
    }

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

    /** GET /configuracao/tipos-venda */
    public function index(): void
    {
        $this->guardaConexao();
        $config = $this->config();

        $extras = $config['tipos_venda_extras'] ?? [];
        if (!is_array($extras)) $extras = [];
        $valor = implode(', ', array_map('intval', $extras));

        $salvo  = !empty($_SESSION['_flash_tipos_venda_salvo']);
        $msg    = $_SESSION['_flash_tipos_venda_msg']  ?? '';
        $erro   = $_SESSION['_flash_tipos_venda_erro'] ?? '';
        unset($_SESSION['_flash_tipos_venda_salvo'],
              $_SESSION['_flash_tipos_venda_msg'],
              $_SESSION['_flash_tipos_venda_erro']);

        View::render('configuracao/tipos_venda', [
            'titulo'   => 'Operações que contam como venda',
            'config'   => $config,
            'segmento' => \App\Core\Lojas::resolverSegmento($config),
            'valor'    => $valor,
            'salvo'    => $salvo,
            'msg'      => $msg,
            'erro'     => $erro,
        ]);
    }

    /** POST /configuracao/tipos-venda */
    public function salvar(): void
    {
        $this->guardaConexao();

        $raw = (string)($_POST['codigos'] ?? '');

        // Sanitiza: só dígitos e vírgulas — descarta o resto
        $limpo = preg_replace('/[^0-9,]/', '', $raw) ?? '';

        // Quebra em códigos únicos e válidos
        $codigos = [];
        foreach (explode(',', $limpo) as $tok) {
            $tok = trim($tok);
            if ($tok === '') continue;
            $n = (int)$tok;
            if ($n > 0 && !in_array($n, $codigos, true)) $codigos[] = $n;
        }

        $path = $this->configPath();
        if (!file_exists($path)) {
            $_SESSION['_flash_tipos_venda_erro'] = 'Arquivo config/database.php não encontrado.';
            header('Location: /configuracao/tipos-venda');
            exit;
        }

        // Carrega o array atual via require e atualiza a chave
        $config = require $path;
        if (!is_array($config)) {
            $_SESSION['_flash_tipos_venda_erro'] = 'config/database.php não retornou um array.';
            header('Location: /configuracao/tipos-venda');
            exit;
        }

        if (empty($codigos)) {
            // Vazio: remove a chave (volta ao default)
            unset($config['tipos_venda_extras']);
        } else {
            $config['tipos_venda_extras'] = $codigos;
        }

        // Backup com timestamp (microtime para garantir nome único)
        $stamp  = date('Ymd-His');
        $backup = $path . '.bak-' . $stamp;
        @copy($path, $backup);

        // Regrava preservando cabeçalho de comentário
        $header  = "<?php\n";
        $header .= "// Configuração gerada automaticamente pelo Premium Express Gestão\n";
        $header .= "// Depto de Engenharia e Automacao - Master Automacao - Autor: Derlivon Silva\n";
        $header .= "// Atualizado em " . date('Y-m-d H:i:s') . " via /configuracao/tipos-venda\n";
        $conteudo = $header . 'return ' . var_export($config, true) . ";\n";

        $okGrava = @file_put_contents($path, $conteudo);
        if ($okGrava === false) {
            $_SESSION['_flash_tipos_venda_erro'] = 'Falha ao gravar config/database.php (permissão de escrita?).';
            header('Location: /configuracao/tipos-venda');
            exit;
        }

        // Invalida OPcache do arquivo, se disponível
        if (function_exists('opcache_invalidate')) {
            @opcache_invalidate($path, true);
        }

        // Limpa o cache JSON do BI (storage/cache/*.json)
        $cacheDir = dirname(__DIR__, 2) . '/storage/cache';
        if (is_dir($cacheDir)) {
            foreach (glob($cacheDir . '/*.json') ?: [] as $f) {
                @unlink($f);
            }
        }

        if (empty($codigos)) {
            $_SESSION['_flash_tipos_venda_msg'] = 'Configuração limpa — voltando ao critério padrão (TIPO_NATUREZA = V).';
        } else {
            $_SESSION['_flash_tipos_venda_msg'] =
                'Configurado! Vendas serão filtradas pelos códigos ' . implode(', ', $codigos) . '.';
        }
        $_SESSION['_flash_tipos_venda_salvo'] = true;

        header('Location: /configuracao/tipos-venda');
        exit;
    }
}
