<?php

namespace App\Controllers;

use App\Core\Auth;
use App\Core\View;
use App\Services\ConfigService;
use App\Services\FirebirdService;

/**
 * Controla a tela de configuração do sistema.
 */
class ConfigController
{
    private ConfigService   $configService;
    private FirebirdService $firebirdService;

    public function __construct()
    {
        $this->configService   = new ConfigService();
        $this->firebirdService = new FirebirdService();
    }

    // -------------------------------------------------------------------------
    // GET /configurar — exibe o formulário
    // -------------------------------------------------------------------------

    private function guardaAdmin(): void
    {
        // Permite acesso livre apenas na primeira vez (sem DB configurado e sem senha)
        $dbConfigurado = file_exists(dirname(__DIR__, 2) . '/config/database.php');
        if (!$dbConfigurado && !Auth::temSenhaCadastrada()) return;

        Auth::verificarOuRedirecionar();
    }

    public function index(): void
    {
        $this->guardaAdmin(); // login admin único libera toda a Configuração

        $config  = $this->configService->carregar();
        $salvo   = file_exists(dirname(__DIR__, 2) . '/config/database.php');
        $segmentos = $this->listarSegmentos();

        View::render('config/index', [
            'titulo'     => 'Configuração — Premium Express Gestão',
            'config'     => $config,
            'salvo'      => $salvo,
            'segmentos'  => $segmentos,
            'erros'      => [],
            'sucesso'    => false,
        ]);
    }

    // -------------------------------------------------------------------------
    // POST /configurar — salva a configuração
    // -------------------------------------------------------------------------

    public function salvar(): void
    {
        $this->guardaAdmin();

        $dados = $this->sanitizar($_POST);
        $erros = $this->configService->validar($dados);

        if (!empty($erros)) {
            View::render('config/index', [
                'titulo'    => 'Configuração — Premium Express Gestão',
                'config'    => $dados,
                'salvo'     => false,
                'segmentos' => $this->listarSegmentos(),
                'erros'     => $erros,
                'sucesso'   => false,
            ]);
            return;
        }

        try {
            $this->configService->salvar($dados);

            View::render('config/index', [
                'titulo'    => 'Configuração — Premium Express Gestão',
                'config'    => $this->configService->carregar(),
                'salvo'     => true,
                'segmentos' => $this->listarSegmentos(),
                'erros'     => [],
                'sucesso'   => true,
            ]);
        } catch (\Throwable $e) {
            View::render('config/index', [
                'titulo'    => 'Configuração — Premium Express Gestão',
                'config'    => $dados,
                'salvo'     => false,
                'segmentos' => $this->listarSegmentos(),
                'erros'     => ['geral' => $e->getMessage()],
                'sucesso'   => false,
            ]);
        }
    }

    // -------------------------------------------------------------------------
    // GET /personalizar — seletor de tema (livre, sem login)
    // -------------------------------------------------------------------------

    public function personalizar(): void
    {
        $config = $this->configService->carregar();

        View::render('config/personalizar', [
            'titulo'    => 'Personalizar — Premium Express Gestão',
            'config'    => $config,
            'sucesso'   => isset($_GET['ok']),
        ]);
    }

    // POST /set-tema — salva apenas o tema (livre, sem login)
    public function setTema(): void
    {
        $tema     = $_POST['tema']     ?? 'claro';
        $redirect = $_POST['redirect'] ?? '/personalizar?ok=1';
        if (!str_starts_with($redirect, '/')) $redirect = '/personalizar?ok=1';

        try {
            $this->configService->salvarTema($tema);
        } catch (\Throwable) {}

        header('Location: ' . $redirect);
        exit;
    }

    // -------------------------------------------------------------------------
    // POST /configurar/testar — testa conexão e retorna JSON
    // -------------------------------------------------------------------------

    public function testar(): void
    {
        header('Content-Type: application/json; charset=UTF-8');

        if (Auth::temSenhaCadastrada() && !Auth::estaLogado()) {
            echo json_encode(['success' => false, 'message' => 'Não autorizado.'], JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
            return;
        }

        $dados = $this->sanitizar($_POST);

        // Se a senha vier vazia, usa a senha salva anteriormente
        if (empty($dados['senha'])) {
            $atual = $this->configService->carregar();
            $dados['senha'] = $atual['password'] ?? '';
        }

        $resultado = $this->firebirdService->testarConexao([
            'tipo'     => $dados['tipo']     ?? 'remota',
            'host'     => $dados['host']     ?? 'localhost',
            'port'     => (int) ($dados['porta'] ?? 3050),
            'database' => $dados['database'] ?? '',
            'username' => $dados['usuario']  ?? 'SYSDBA',
            'charset'  => $dados['charset']  ?? 'UTF8',
            'password' => $dados['senha'],
        ]);

        echo json_encode($resultado, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE);
    }

    // -------------------------------------------------------------------------
    // Internos
    // -------------------------------------------------------------------------

    private function sanitizar(array $input): array
    {
        $saida = [];
        foreach ($input as $chave => $valor) {
            // Remove tags HTML e espaços extras
            $saida[$chave] = is_string($valor) ? trim(strip_tags($valor)) : $valor;
        }
        return $saida;
    }

    private function listarSegmentos(): array
    {
        return [
            // ── Alimentação com mesas ──────────────────────────────────────
            ['id' => 'restaurante',          'label' => 'Restaurante',              'icone' => 'bi-egg-fried',          'grupo' => 'Alimentação c/ Mesas'],
            ['id' => 'bar',                  'label' => 'Bar',                      'icone' => 'bi-cup-straw',          'grupo' => 'Alimentação c/ Mesas'],
            ['id' => 'lanchonete',           'label' => 'Lanchonete',               'icone' => 'bi-cup-hot-fill',       'grupo' => 'Alimentação c/ Mesas'],
            ['id' => 'sushi',                'label' => 'Sushi / Japonês',          'icone' => 'bi-fish',               'grupo' => 'Alimentação c/ Mesas'],
            ['id' => 'pizzaria',             'label' => 'Pizzaria',                 'icone' => 'bi-circle',             'grupo' => 'Alimentação c/ Mesas'],
            ['id' => 'churrascaria',         'label' => 'Churrascaria',             'icone' => 'bi-fire',               'grupo' => 'Alimentação c/ Mesas'],
            // ── Alimentação balcão / varejo ──────────────────────────────
            ['id' => 'padaria',              'label' => 'Padaria',                  'icone' => 'bi-cake2-fill',         'grupo' => 'Alimentação Balcão'],
            ['id' => 'sorveteria',           'label' => 'Sorveteria',               'icone' => 'bi-cup-straw',          'grupo' => 'Alimentação Balcão'],
            ['id' => 'acougue',              'label' => 'Açougue',                  'icone' => 'bi-scissors',           'grupo' => 'Alimentação Balcão'],
            // ── Varejo / Comércio ────────────────────────────────────────
            ['id' => 'supermercado',         'label' => 'Supermercado',             'icone' => 'bi-cart4',              'grupo' => 'Varejo'],
            ['id' => 'conveniencia',         'label' => 'Conveniência',             'icone' => 'bi-shop-window',        'grupo' => 'Varejo'],
            ['id' => 'loja_geral',           'label' => 'Loja Geral',               'icone' => 'bi-bag-fill',           'grupo' => 'Varejo'],
            ['id' => 'farmacia',             'label' => 'Farmácia',                 'icone' => 'bi-capsule',            'grupo' => 'Varejo'],
            ['id' => 'pet_shop',             'label' => 'Pet Shop',                 'icone' => 'bi-heart-fill',         'grupo' => 'Varejo'],
            // ── Distribuição / Atacado ───────────────────────────────────
            ['id' => 'distribuidora',        'label' => 'Distribuidora',            'icone' => 'bi-truck',              'grupo' => 'Distribuição'],
            ['id' => 'atacado',              'label' => 'Atacado',                  'icone' => 'bi-boxes',              'grupo' => 'Distribuição'],
            // ── Construção / Utilidades ──────────────────────────────────
            ['id' => 'material_construcao',  'label' => 'Material de Construção',   'icone' => 'bi-hammer',             'grupo' => 'Construção'],
            ['id' => 'utilidades',           'label' => 'Utilidades Domésticas',    'icone' => 'bi-wrench-adjustable',  'grupo' => 'Construção'],
            // ── Serviços / Tecnologia ────────────────────────────────────
            ['id' => 'oficina',              'label' => 'Oficina Mecânica',         'icone' => 'bi-gear-wide-connected','grupo' => 'Serviços'],
            ['id' => 'automacao_comercial',  'label' => 'Automação Comercial',      'icone' => 'bi-cpu-fill',           'grupo' => 'Serviços'],
            ['id' => 'clinica',              'label' => 'Clínica / Saúde',          'icone' => 'bi-hospital',           'grupo' => 'Serviços'],
            ['id' => 'salao_beleza',         'label' => 'Salão de Beleza',          'icone' => 'bi-scissors',           'grupo' => 'Serviços'],
        ];
    }
}
