<?php

namespace App\Http\Livewire\Admin;

use App\Models\ConfiguracaoSistema;
use App\Models\Departamento;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;

class Configuracoes extends Component
{
    public string $aba = 'geral';

    public string $nome_portal = 'Aquila-System';
    public string $empresa_nome = 'Aquila Express';
    public string $email_suporte = 'suporte@aquila.local';
    public string $url_sistema = '';
    public ?int $departamento_padrao_id = null;
    public string $fuso_horario = 'America/Sao_Paulo';
    public string $tema_padrao = 'dark';
    public bool $cadastro_publico = false;
    public bool $exigir_email_verificado = false;
    public int $tentativas_login = 5;
    public int $sessao_minutos = 120;
    public int $limite_imagem_mb = 5;
    public int $limite_video_mb = 100;
    public int $limite_documento_mb = 20;
    public bool $notificacoes_email = false;
    public string $email_remetente = 'no-reply@aquila.local';
    public int $retencao_auditoria_dias = 180;
    public bool $auditoria_logins = true;
    public bool $auditoria_wiki = true;
    public string $aviso_global = '';

    public function mount(): void
    {
        abort_unless(Auth::user()?->can('sistema.configurar'), 403);

        $this->url_sistema = config('app.url');
        $this->carregarConfiguracoes();
    }

    public function salvar(): void
    {
        $dados = $this->validate([
            'nome_portal' => ['required', 'string', 'max:120'],
            'empresa_nome' => ['required', 'string', 'max:160'],
            'email_suporte' => ['required', 'email', 'max:160'],
            'url_sistema' => ['required', 'url', 'max:255'],
            'departamento_padrao_id' => ['nullable', 'exists:departamentos,id'],
            'fuso_horario' => ['required', 'string', 'max:80'],
            'tema_padrao' => ['required', 'in:dark,light'],
            'cadastro_publico' => ['boolean'],
            'exigir_email_verificado' => ['boolean'],
            'tentativas_login' => ['required', 'integer', 'min:3', 'max:20'],
            'sessao_minutos' => ['required', 'integer', 'min:15', 'max:1440'],
            'limite_imagem_mb' => ['required', 'integer', 'min:1', 'max:50'],
            'limite_video_mb' => ['required', 'integer', 'min:10', 'max:500'],
            'limite_documento_mb' => ['required', 'integer', 'min:1', 'max:100'],
            'notificacoes_email' => ['boolean'],
            'email_remetente' => ['required', 'email', 'max:160'],
            'retencao_auditoria_dias' => ['required', 'integer', 'min:30', 'max:3650'],
            'auditoria_logins' => ['boolean'],
            'auditoria_wiki' => ['boolean'],
            'aviso_global' => ['nullable', 'string', 'max:500'],
        ]);

        foreach ($this->mapaConfiguracoes() as $chave => $meta) {
            ConfiguracaoSistema::updateOrCreate(
                ['chave' => $chave],
                [
                    'grupo' => $meta['grupo'],
                    'tipo' => $meta['tipo'],
                    'valor' => $this->normalizarValor($dados[$chave] ?? null, $meta['tipo']),
                    'descricao' => $meta['descricao'],
                ]
            );
        }

        $this->dispatchBrowserEvent('notify', ['message' => 'Configuracoes salvas com sucesso.']);
    }

    public function restaurarPadrao(): void
    {
        foreach ($this->valoresPadrao() as $chave => $valor) {
            $this->{$chave} = $valor;
        }

        $this->dispatchBrowserEvent('notify', ['message' => 'Padroes carregados. Clique em salvar para aplicar.']);
    }

    public function render()
    {
        return view('livewire.admin.configuracoes', [
            'departamentos' => Departamento::where('ativo', true)->orderBy('nome')->get(),
            'abas' => $this->abas(),
            'indicadores' => $this->indicadores(),
        ])->layout('layouts.app');
    }

    private function carregarConfiguracoes(): void
    {
        foreach ($this->mapaConfiguracoes() as $chave => $meta) {
            $this->{$chave} = ConfiguracaoSistema::valor($chave, $this->{$chave});
        }
    }

    private function normalizarValor(mixed $valor, string $tipo): string
    {
        return match ($tipo) {
            'booleano' => $valor ? '1' : '0',
            default => (string) $valor,
        };
    }

    private function valoresPadrao(): array
    {
        return [
            'nome_portal' => 'Aquila-System',
            'empresa_nome' => 'Aquila Express',
            'email_suporte' => 'suporte@aquila.local',
            'url_sistema' => config('app.url'),
            'departamento_padrao_id' => null,
            'fuso_horario' => 'America/Sao_Paulo',
            'tema_padrao' => 'dark',
            'cadastro_publico' => false,
            'exigir_email_verificado' => false,
            'tentativas_login' => 5,
            'sessao_minutos' => 120,
            'limite_imagem_mb' => 5,
            'limite_video_mb' => 100,
            'limite_documento_mb' => 20,
            'notificacoes_email' => false,
            'email_remetente' => 'no-reply@aquila.local',
            'retencao_auditoria_dias' => 180,
            'auditoria_logins' => true,
            'auditoria_wiki' => true,
            'aviso_global' => '',
        ];
    }

    private function mapaConfiguracoes(): array
    {
        return [
            'nome_portal' => ['grupo' => 'geral', 'tipo' => 'texto', 'descricao' => 'Nome exibido no portal.'],
            'empresa_nome' => ['grupo' => 'geral', 'tipo' => 'texto', 'descricao' => 'Nome institucional da empresa.'],
            'email_suporte' => ['grupo' => 'geral', 'tipo' => 'texto', 'descricao' => 'Canal principal de suporte interno.'],
            'url_sistema' => ['grupo' => 'geral', 'tipo' => 'texto', 'descricao' => 'URL base do sistema.'],
            'departamento_padrao_id' => ['grupo' => 'geral', 'tipo' => 'inteiro', 'descricao' => 'Departamento sugerido em cadastros.'],
            'fuso_horario' => ['grupo' => 'geral', 'tipo' => 'texto', 'descricao' => 'Fuso horario operacional.'],
            'tema_padrao' => ['grupo' => 'identidade', 'tipo' => 'texto', 'descricao' => 'Tema inicial do portal.'],
            'cadastro_publico' => ['grupo' => 'seguranca', 'tipo' => 'booleano', 'descricao' => 'Permite cadastro aberto.'],
            'exigir_email_verificado' => ['grupo' => 'seguranca', 'tipo' => 'booleano', 'descricao' => 'Exige verificacao de e-mail.'],
            'tentativas_login' => ['grupo' => 'seguranca', 'tipo' => 'inteiro', 'descricao' => 'Tentativas antes do bloqueio temporario.'],
            'sessao_minutos' => ['grupo' => 'seguranca', 'tipo' => 'inteiro', 'descricao' => 'Tempo desejado de sessao.'],
            'limite_imagem_mb' => ['grupo' => 'midia', 'tipo' => 'inteiro', 'descricao' => 'Limite de upload para imagens.'],
            'limite_video_mb' => ['grupo' => 'midia', 'tipo' => 'inteiro', 'descricao' => 'Limite de upload para videos.'],
            'limite_documento_mb' => ['grupo' => 'midia', 'tipo' => 'inteiro', 'descricao' => 'Limite de upload para documentos.'],
            'notificacoes_email' => ['grupo' => 'notificacoes', 'tipo' => 'booleano', 'descricao' => 'Habilita notificacoes por e-mail.'],
            'email_remetente' => ['grupo' => 'notificacoes', 'tipo' => 'texto', 'descricao' => 'E-mail remetente padrao.'],
            'retencao_auditoria_dias' => ['grupo' => 'auditoria', 'tipo' => 'inteiro', 'descricao' => 'Retencao de logs em dias.'],
            'auditoria_logins' => ['grupo' => 'auditoria', 'tipo' => 'booleano', 'descricao' => 'Registra logins e logouts.'],
            'auditoria_wiki' => ['grupo' => 'auditoria', 'tipo' => 'booleano', 'descricao' => 'Registra eventos importantes da Wiki.'],
            'aviso_global' => ['grupo' => 'notificacoes', 'tipo' => 'texto', 'descricao' => 'Aviso operacional exibido no futuro.'],
        ];
    }

    private function abas(): array
    {
        return [
            'geral' => ['nome' => 'Geral', 'icone' => 'building-office-2'],
            'identidade' => ['nome' => 'Identidade', 'icone' => 'swatch'],
            'seguranca' => ['nome' => 'Seguranca', 'icone' => 'shield-check'],
            'midia' => ['nome' => 'Arquivos e midia', 'icone' => 'paper-clip'],
            'notificacoes' => ['nome' => 'Notificacoes', 'icone' => 'bell'],
            'auditoria' => ['nome' => 'Auditoria', 'icone' => 'clipboard-document-check'],
        ];
    }

    private function indicadores(): array
    {
        return [
            ['nome' => 'Empresa', 'valor' => $this->empresa_nome, 'icone' => 'building-office-2'],
            ['nome' => 'Seguranca', 'valor' => "{$this->tentativas_login} tentativas", 'icone' => 'shield-check'],
            ['nome' => 'Video', 'valor' => "{$this->limite_video_mb} MB", 'icone' => 'play-circle'],
            ['nome' => 'Auditoria', 'valor' => "{$this->retencao_auditoria_dias} dias", 'icone' => 'clipboard-document-check'],
        ];
    }
}
