<?php

namespace Database\Seeders;

use App\Models\Categoria;
use App\Models\ConfiguracaoSistema;
use App\Models\Departamento;
use App\Models\Subcategoria;
use App\Models\User;
use App\Support\ModuloPortal;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();

        $permissoes = [
            'portal.acessar',
            'wiki.visualizar',
            'wiki.criar',
            'wiki.editar',
            'wiki.comentar',
            'modulos.visualizar',
            'usuarios.gerenciar',
            'permissoes.gerenciar',
            'departamentos.gerenciar',
            'sistema.configurar',
            'auditoria.visualizar',
        ];

        $permissoes = array_values(array_unique(array_merge($permissoes, ModuloPortal::permissoes())));

        foreach ($permissoes as $permissao) {
            Permission::firstOrCreate(['name' => $permissao]);
        }

        $papeis = [
            'Administrador Master' => $permissoes,
            'Diretoria' => $permissoes,
            'Gerencia' => ['portal.acessar', 'wiki.visualizar', 'wiki.criar', 'wiki.editar', 'wiki.comentar', 'modulos.visualizar', 'auditoria.visualizar', 'modulo.relatorios.acessar'],
            'Coordenador' => ['portal.acessar', 'wiki.visualizar', 'wiki.criar', 'wiki.editar', 'wiki.comentar', 'modulos.visualizar'],
            'Colaborador' => ['portal.acessar', 'wiki.visualizar', 'wiki.comentar', 'modulos.visualizar'],
        ];

        foreach ($papeis as $nome => $permissoesDoPapel) {
            Role::firstOrCreate(['name' => $nome])->syncPermissions($permissoesDoPapel);
        }

        $departamentos = [
            ['nome' => 'Rastreamento', 'descricao' => 'Consultas de entrega, ocorrencias e rastreabilidade operacional.', 'icone' => 'map-pin'],
            ['nome' => 'Emissao', 'descricao' => 'Emissao de documentos, notas, CTe e processos fiscais.', 'icone' => 'document-text'],
            ['nome' => 'Financeiro', 'descricao' => 'Contas, aprovacao, faturamento e indicadores financeiros.', 'icone' => 'banknotes'],
            ['nome' => 'RH', 'descricao' => 'Pessoas, cultura, beneficios e documentos internos.', 'icone' => 'users'],
            ['nome' => 'Compras', 'descricao' => 'Fornecedores, cotacoes e suprimentos.', 'icone' => 'shopping-cart'],
            ['nome' => 'Farmaceutico', 'descricao' => 'Procedimentos e controles para operacoes farmaceuticas.', 'icone' => 'beaker'],
        ];

        foreach ($departamentos as $departamento) {
            $registro = Departamento::updateOrCreate(
                ['slug' => Str::slug($departamento['nome'])],
                $departamento + ['ativo' => true]
            );

            Categoria::firstOrCreate(
                ['departamento_id' => $registro->id, 'slug' => 'geral'],
                [
                    'nome' => 'Geral',
                    'descricao' => "Categoria legada do departamento {$registro->nome}.",
                ]
            );

            foreach (['Geral', 'Procedimentos'] as $subcategoria) {
                Subcategoria::firstOrCreate(
                    ['departamento_id' => $registro->id, 'nome' => $subcategoria],
                    ['slug' => Str::slug($subcategoria), 'ativo' => true]
                );
            }
        }

        $departamentoAdmin = Departamento::where('slug', 'rastreamento')->first();

        $admin = User::firstOrCreate(
            ['email' => 'admin@admin.com'],
            [
                'name' => 'Administrador Master',
                'password' => Hash::make('password'),
                'departamento_id' => $departamentoAdmin?->id,
                'ativo' => true,
            ]
        );

        $admin->forceFill(['ativo' => true])->save();
        $admin->assignRole('Administrador Master');

        $configuracoes = [
            ['chave' => 'nome_portal', 'grupo' => 'geral', 'tipo' => 'texto', 'valor' => 'Aquila-System', 'descricao' => 'Nome exibido no portal.'],
            ['chave' => 'empresa_nome', 'grupo' => 'geral', 'tipo' => 'texto', 'valor' => 'Aquila Express', 'descricao' => 'Nome institucional da empresa.'],
            ['chave' => 'email_suporte', 'grupo' => 'geral', 'tipo' => 'texto', 'valor' => 'suporte@aquila.local', 'descricao' => 'Canal principal de suporte interno.'],
            ['chave' => 'url_sistema', 'grupo' => 'geral', 'tipo' => 'texto', 'valor' => config('app.url'), 'descricao' => 'URL base do sistema.'],
            ['chave' => 'departamento_padrao_id', 'grupo' => 'geral', 'tipo' => 'inteiro', 'valor' => (string) $departamentoAdmin?->id, 'descricao' => 'Departamento sugerido em cadastros.'],
            ['chave' => 'fuso_horario', 'grupo' => 'geral', 'tipo' => 'texto', 'valor' => 'America/Sao_Paulo', 'descricao' => 'Fuso horario operacional.'],
            ['chave' => 'tema_padrao', 'grupo' => 'identidade', 'tipo' => 'texto', 'valor' => 'dark', 'descricao' => 'Tema inicial do portal.'],
            ['chave' => 'cadastro_publico', 'grupo' => 'seguranca', 'tipo' => 'booleano', 'valor' => '0', 'descricao' => 'Permite cadastro aberto.'],
            ['chave' => 'exigir_email_verificado', 'grupo' => 'seguranca', 'tipo' => 'booleano', 'valor' => '0', 'descricao' => 'Exige verificacao de e-mail.'],
            ['chave' => 'tentativas_login', 'grupo' => 'seguranca', 'tipo' => 'inteiro', 'valor' => '5', 'descricao' => 'Tentativas antes do bloqueio temporario.'],
            ['chave' => 'sessao_minutos', 'grupo' => 'seguranca', 'tipo' => 'inteiro', 'valor' => '120', 'descricao' => 'Tempo desejado de sessao.'],
            ['chave' => 'limite_imagem_mb', 'grupo' => 'midia', 'tipo' => 'inteiro', 'valor' => '5', 'descricao' => 'Limite de upload para imagens.'],
            ['chave' => 'limite_video_mb', 'grupo' => 'midia', 'tipo' => 'inteiro', 'valor' => '100', 'descricao' => 'Limite de upload para videos.'],
            ['chave' => 'limite_documento_mb', 'grupo' => 'midia', 'tipo' => 'inteiro', 'valor' => '20', 'descricao' => 'Limite de upload para documentos.'],
            ['chave' => 'notificacoes_email', 'grupo' => 'notificacoes', 'tipo' => 'booleano', 'valor' => '0', 'descricao' => 'Habilita notificacoes por e-mail.'],
            ['chave' => 'email_remetente', 'grupo' => 'notificacoes', 'tipo' => 'texto', 'valor' => 'no-reply@aquila.local', 'descricao' => 'E-mail remetente padrao.'],
            ['chave' => 'retencao_auditoria_dias', 'grupo' => 'auditoria', 'tipo' => 'inteiro', 'valor' => '180', 'descricao' => 'Retencao de logs em dias.'],
            ['chave' => 'auditoria_logins', 'grupo' => 'auditoria', 'tipo' => 'booleano', 'valor' => '1', 'descricao' => 'Registra logins e logouts.'],
            ['chave' => 'auditoria_wiki', 'grupo' => 'auditoria', 'tipo' => 'booleano', 'valor' => '1', 'descricao' => 'Registra eventos importantes da Wiki.'],
            ['chave' => 'aviso_global', 'grupo' => 'notificacoes', 'tipo' => 'texto', 'valor' => '', 'descricao' => 'Aviso operacional exibido no futuro.'],
        ];

        foreach ($configuracoes as $configuracao) {
            ConfiguracaoSistema::updateOrCreate(
                ['chave' => $configuracao['chave']],
                $configuracao
            );
        }
    }
}
