import { internalMutation } from "./_generated/server";
import { v } from "convex/values";
import { hashPassword } from "./auth/utils";

// Dados exportados do Convex Cloud
const simbolosData = [
  {
    descricao: "Cargo de Direção e Assessoramento Superior - 5",
    nome: "DAS-5",
    repValor: "4747.84",
    tipo: "cargo_comissionado" as const,
    valor: "5934.80",
    vencValor: "1186.96",
  },
  {
    descricao: "Cargo de Direção e Assessoramento Superior - 3",
    nome: "DAS-3",
    repValor: "6273.92",
    tipo: "cargo_comissionado" as const,
    valor: "7842.40",
    vencValor: "1568.48",
  },
  {
    descricao: "Cargo de Direção e Assessoramento Superior -2",
    nome: "DAS - 2",
    repValor: "7460.87",
    tipo: "cargo_comissionado" as const,
    valor: "9326.09",
    vencValor: "1865.22",
  },
  {
    descricao: "Cargo de Apoio e Assessoramento - 1",
    nome: "CAA-1",
    repValor: "4120.43",
    tipo: "cargo_comissionado" as const,
    valor: "5150.54",
    vencValor: "1030.11",
  },
  {
    descricao: "Função Gratificada de Direção e Assessoramento",
    nome: "FDA",
    repValor: "",
    tipo: "funcao_gratificada" as const,
    valor: "7460.87",
    vencValor: "",
  },
  {
    descricao: "Função Gratificada de Supervisão - 3",
    nome: "CAA - 3",
    repValor: "2204.36",
    tipo: "cargo_comissionado" as const,
    valor: "2755.45",
    vencValor: "551.09",
  },
  {
    descricao: "Função Gratificada de Direção e Assessoramento -1",
    nome: "FDA-1",
    repValor: "",
    tipo: "funcao_gratificada" as const,
    valor: "6273.92",
    vencValor: "",
  },
  {
    descricao: "Função Gratificada de Direção e Assessoramento -2",
    nome: "FDA -2",
    repValor: "",
    tipo: "funcao_gratificada" as const,
    valor: "5765.22",
    vencValor: "",
  },
  {
    descricao: "Função Gratificada de Direção e Assessoramento - 3",
    nome: "FDA - 3",
    repValor: "",
    tipo: "funcao_gratificada" as const,
    valor: "4747.83",
    vencValor: "",
  },
  {
    descricao: "Função Gratificada de Direção e Assessoramento - 4",
    nome: "FDA - 4",
    repValor: "",
    tipo: "funcao_gratificada" as const,
    valor: "3391.31",
    vencValor: "",
  },
  {
    descricao: "Função Gratificada de Supervisão - 1",
    nome: "FGS -1 ",
    repValor: "",
    tipo: "funcao_gratificada" as const,
    valor: "1532.08",
    vencValor: "",
  },
  {
    descricao: "Função Gratificada de Supervisão - 2",
    nome: "FGS - 2",
    repValor: "",
    tipo: "funcao_gratificada" as const,
    valor: "934.74",
    vencValor: "",
  },
  {
    descricao: "Função Gratificada de Supervisão - 2",
    nome: "CAA - 2",
    repValor: "3391.31",
    tipo: "cargo_comissionado" as const,
    valor: "4239.14",
    vencValor: "847.83",
  },
];

const funcionariosData = [
  {
    admissaoData: "01/01/2000",
    cep: "50740500",
    cidade: "Recife",
    cpf: "04281554645",
    email: "kilder@kilder.com.br",
    endereco: "Rua Bernardino Alves Maia, Várzea",
    matricula: "4585",
    nascimento: "01/01/2000",
    nome: "Madson Kilder",
    rg: "123456122",
    simboloNome: "DAS-3", // Será convertido para ID
    simboloTipo: "cargo_comissionado" as const,
    telefone: "8101234564",
    uf: "PE",
  },
  {
    admissaoData: "01/01/2000",
    cep: "50740400",
    cidade: "Recife",
    cpf: "05129038401",
    email: "princesalves@gmail.com",
    endereco: "Rua Deputado Cunha Rabelo, Várzea",
    matricula: "123456",
    nascimento: "05/01/1985",
    nome: "Princes Alves rocha wanderley",
    rg: "639541200",
    simboloNome: "FDA-1", // Será convertido para ID
    simboloTipo: "funcao_gratificada" as const,
    telefone: "81123456455",
    uf: "PE",
  },
  {
    admissaoData: "01/10/2025",
    cep: "50740400",
    cidade: "Recife",
    cpf: "06102637496",
    email: "deyvison.wanderley@gmail.com",
    endereco: "Rua Deputado Cunha Rabelo, Várzea",
    matricula: "256220",
    nascimento: "16/03/1985",
    nome: "Deyvison de França Wanderley",
    rg: "6347974",
    simboloNome: "CAA-1", // Será convertido para ID
    simboloTipo: "cargo_comissionado" as const,
    telefone: "81994235551",
    uf: "PE",
  },
];

const solicitacoesAcessoData = [
  {
    dataResposta: 1761445098933,
    dataSolicitacao: 1761445038329,
    email: "severino@gmail.com",
    matricula: "3231",
    nome: "Severino Gates",
    observacoes: "Aprovação realizada por Deyvison",
    status: "aprovado" as const,
    telefone: "(81) 9942-3551",
  },
  {
    dataSolicitacao: 1761445187258,
    email: "michaeljackson@gmail.com",
    matricula: "123321",
    nome: "Michael Jackson",
    status: "pendente" as const,
    telefone: "(81) 99423-5551",
  },
];

/**
 * Seed inicial do banco de dados com os dados exportados do Convex Cloud
 */
export const seedDatabase = internalMutation({
  args: {},
  returns: v.null(),
  handler: async (ctx) => {
    console.log("🌱 Iniciando seed do banco de dados...");

    // 1. Criar Roles (Perfis de Acesso)
    console.log("🔐 Criando roles...");
    // TI_MASTER - Nível 0 - Acesso total irrestrito
    const roleTIMaster = await ctx.db.insert("roles", {
      nome: "ti_master",
      descricao: "TI Master",
      nivel: 0,
      setor: "ti",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: ti_master (Nível 0 - Acesso Total)");

    // ADMIN - Nível 2 - Permissões configuráveis
    const roleAdmin = await ctx.db.insert("roles", {
      nome: "admin",
      descricao: "Administrador Geral",
      nivel: 2,
      setor: "administrativo",
      customizado: false,
      editavel: true, // Permissões configuráveis
    });
    console.log("  ✅ Role criada: admin (Nível 2 - Configurável)");

    // TI_USUARIO - Nível 2 - Suporte técnico
    const roleTIUsuario = await ctx.db.insert("roles", {
      nome: "ti_usuario",
      descricao: "TI Usuário",
      nivel: 2,
      setor: "ti",
      customizado: false,
      editavel: true,
    });
    console.log("  ✅ Role criada: ti_usuario (Nível 2 - Suporte)");

    const roleRH = await ctx.db.insert("roles", {
      nome: "rh",
      descricao: "Recursos Humanos",
      nivel: 2,
      setor: "recursos_humanos",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: rh");

    const roleFinanceiro = await ctx.db.insert("roles", {
      nome: "financeiro",
      descricao: "Financeiro",
      nivel: 2,
      setor: "financeiro",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: financeiro");

    const roleControladoria = await ctx.db.insert("roles", {
      nome: "controladoria",
      descricao: "Controladoria",
      nivel: 2,
      setor: "controladoria",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: controladoria");

    const roleLicitacoes = await ctx.db.insert("roles", {
      nome: "licitacoes",
      descricao: "Licitações",
      nivel: 2,
      setor: "licitacoes",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: licitacoes");

    const roleCompras = await ctx.db.insert("roles", {
      nome: "compras",
      descricao: "Compras",
      nivel: 2,
      setor: "compras",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: compras");

    const roleJuridico = await ctx.db.insert("roles", {
      nome: "juridico",
      descricao: "Jurídico",
      nivel: 2,
      setor: "juridico",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: juridico");

    const roleComunicacao = await ctx.db.insert("roles", {
      nome: "comunicacao",
      descricao: "Comunicação",
      nivel: 2,
      setor: "comunicacao",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: comunicacao");

    const roleProgramasEsportivos = await ctx.db.insert("roles", {
      nome: "programas_esportivos",
      descricao: "Programas Esportivos",
      nivel: 2,
      setor: "programas_esportivos",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: programas_esportivos");

    const roleSecretariaExecutiva = await ctx.db.insert("roles", {
      nome: "secretaria_executiva",
      descricao: "Secretaria Executiva",
      nivel: 2,
      setor: "secretaria_executiva",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: secretaria_executiva");

    const roleGestaoPessoas = await ctx.db.insert("roles", {
      nome: "gestao_pessoas",
      descricao: "Gestão de Pessoas",
      nivel: 2,
      setor: "gestao_pessoas",
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: gestao_pessoas");

    const roleUsuario = await ctx.db.insert("roles", {
      nome: "usuario",
      descricao: "Usuário Comum",
      nivel: 10,
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: usuario");

    // 2. Criar usuários iniciais
    console.log("👤 Criando usuários iniciais...");
    
    // TI Master
    const senhaTIMaster = await hashPassword("TI@123");
    await ctx.db.insert("usuarios", {
      matricula: "1000",
      senhaHash: senhaTIMaster,
      nome: "Gestor TI Master",
      email: "ti.master@sgse.pe.gov.br",
      setor: "ti",
      roleId: roleTIMaster as any,
      ativo: true,
      primeiroAcesso: false,
      criadoEm: Date.now(),
      atualizadoEm: Date.now(),
    });
    console.log("  ✅ TI Master criado (matrícula: 1000, senha: TI@123)");

    // Admin (permissões configuráveis)
    const senhaAdmin = await hashPassword("Admin@123");
    const adminId = await ctx.db.insert("usuarios", {
      matricula: "2000",
      senhaHash: senhaAdmin,
      nome: "Administrador Geral",
      email: "admin@sgse.pe.gov.br",
      setor: "administrativo",
      roleId: roleAdmin as any,
      ativo: true,
      primeiroAcesso: false,
      criadoEm: Date.now(),
      atualizadoEm: Date.now(),
    });
    console.log("  ✅ Admin criado (matrícula: 2000, senha: Admin@123)");

    // 3. Inserir símbolos
    console.log("📝 Inserindo símbolos...");
    const simbolosMap = new Map<string, string>();
    
    for (const simbolo of simbolosData) {
      const id = await ctx.db.insert("simbolos", {
        descricao: simbolo.descricao,
        nome: simbolo.nome,
        repValor: simbolo.repValor,
        tipo: simbolo.tipo,
        valor: simbolo.valor,
        vencValor: simbolo.vencValor,
      });
      simbolosMap.set(simbolo.nome, id);
      console.log(`  ✅ Símbolo criado: ${simbolo.nome}`);
    }

    // 4. Inserir funcionários
    console.log("👥 Inserindo funcionários...");
    const funcionariosMap = new Map<string, string>();
    for (const funcionario of funcionariosData) {
      const simboloId = simbolosMap.get(funcionario.simboloNome);
      if (!simboloId) {
        console.error(`  ❌ Símbolo não encontrado: ${funcionario.simboloNome}`);
        continue;
      }

      const funcId = await ctx.db.insert("funcionarios", {
        admissaoData: funcionario.admissaoData,
        cep: funcionario.cep,
        cidade: funcionario.cidade,
        cpf: funcionario.cpf,
        email: funcionario.email,
        endereco: funcionario.endereco,
        matricula: funcionario.matricula,
        nascimento: funcionario.nascimento,
        nome: funcionario.nome,
        rg: funcionario.rg,
        simboloId: simboloId as any,
        simboloTipo: funcionario.simboloTipo,
        telefone: funcionario.telefone,
        uf: funcionario.uf,
      });
      funcionariosMap.set(funcionario.matricula, funcId);
      console.log(`  ✅ Funcionário criado: ${funcionario.nome}`);
    }

    // 5. Criar usuários para os funcionários
    console.log("👤 Criando usuários para funcionários...");
    for (const funcionario of funcionariosData) {
      const funcId = funcionariosMap.get(funcionario.matricula);
      if (!funcId) continue;

      const senhaInicial = await hashPassword("Mudar@123");
      await ctx.db.insert("usuarios", {
        matricula: funcionario.matricula,
        senhaHash: senhaInicial,
        nome: funcionario.nome,
        email: funcionario.email,
        funcionarioId: funcId as any,
        roleId: roleUsuario as any,
        ativo: true,
        primeiroAcesso: true,
        criadoEm: Date.now(),
        atualizadoEm: Date.now(),
      });
      console.log(`  ✅ Usuário criado: ${funcionario.nome} (senha: Mudar@123)`);
    }

    // 6. Inserir solicitações de acesso
    console.log("📋 Inserindo solicitações de acesso...");
    for (const solicitacao of solicitacoesAcessoData) {
      await ctx.db.insert("solicitacoesAcesso", {
        dataResposta: solicitacao.dataResposta,
        dataSolicitacao: solicitacao.dataSolicitacao,
        email: solicitacao.email,
        matricula: solicitacao.matricula,
        nome: solicitacao.nome,
        observacoes: solicitacao.observacoes,
        status: solicitacao.status,
        telefone: solicitacao.telefone,
      });
      console.log(`  ✅ Solicitação criada: ${solicitacao.nome}`);
    }

    // 7. Criar templates de mensagens padrão
    console.log("📧 Criando templates de mensagens padrão...");
    const templatesPadrao = [
      {
        codigo: "USUARIO_BLOQUEADO",
        nome: "Usuário Bloqueado",
        titulo: "Sua conta foi bloqueada",
        corpo: "Sua conta no SGSE foi bloqueada.\\n\\nMotivo: {{motivo}}\\n\\nPara mais informações, entre em contato com a TI.",
        variaveis: ["motivo"],
      },
      {
        codigo: "USUARIO_DESBLOQUEADO",
        nome: "Usuário Desbloqueado",
        titulo: "Sua conta foi desbloqueada",
        corpo: "Sua conta no SGSE foi desbloqueada e você já pode acessar o sistema normalmente.",
        variaveis: [],
      },
      {
        codigo: "SENHA_RESETADA",
        nome: "Senha Resetada",
        titulo: "Sua senha foi resetada",
        corpo: "Sua senha foi resetada pela equipe de TI.\\n\\nNova senha temporária: {{senha}}\\n\\nPor favor, altere sua senha no próximo login.",
        variaveis: ["senha"],
      },
      {
        codigo: "PERMISSAO_ALTERADA",
        nome: "Permissão Alterada",
        titulo: "Suas permissões foram atualizadas",
        corpo: "Suas permissões de acesso ao sistema foram atualizadas.\\n\\nPara verificar suas novas permissões, acesse o menu de perfil.",
        variaveis: [],
      },
      {
        codigo: "AVISO_GERAL",
        nome: "Aviso Geral",
        titulo: "{{titulo}}",
        corpo: "{{mensagem}}",
        variaveis: ["titulo", "mensagem"],
      },
      {
        codigo: "BEM_VINDO",
        nome: "Boas-vindas",
        titulo: "Bem-vindo ao SGSE",
        corpo: "Olá {{nome}},\\n\\nSeja bem-vindo ao Sistema de Gestão da Secretaria de Esportes!\\n\\nSuas credenciais de acesso:\\nMatrícula: {{matricula}}\\nSenha temporária: {{senha}}\\n\\nPor favor, altere sua senha no primeiro acesso.\\n\\nEquipe de TI",
        variaveis: ["nome", "matricula", "senha"],
      },
    ];

    for (const template of templatesPadrao) {
      await ctx.db.insert("templatesMensagens", {
        codigo: template.codigo,
        nome: template.nome,
        tipo: "sistema" as const,
        titulo: template.titulo,
        corpo: template.corpo,
        variaveis: template.variaveis,
        criadoEm: Date.now(),
      });
      console.log(`  ✅ Template criado: ${template.nome}`);
    }

    console.log("✨ Seed concluído com sucesso!");
    console.log("");
    console.log("🔑 CREDENCIAIS DE ACESSO:");
    console.log("  Admin: matrícula 0000, senha Admin@123");
    console.log("  TI: matrícula 1000, senha TI@123");
    console.log("  Funcionários: usar matrícula, senha Mudar@123");
    return null;
  },
});

/**
 * Limpar todos os dados do banco
 */
export const clearDatabase = internalMutation({
  args: {},
  returns: v.null(),
  handler: async (ctx) => {
    console.log("🗑️  Limpando banco de dados...");

    // Limpar logs de acesso
    const logs = await ctx.db.query("logsAcesso").collect();
    for (const log of logs) {
      await ctx.db.delete(log._id);
    }
    console.log(`  ✅ ${logs.length} logs de acesso removidos`);

    // Limpar sessões
    const sessoes = await ctx.db.query("sessoes").collect();
    for (const sessao of sessoes) {
      await ctx.db.delete(sessao._id);
    }
    console.log(`  ✅ ${sessoes.length} sessões removidas`);

    // Limpar usuários
    const usuarios = await ctx.db.query("usuarios").collect();
    for (const usuario of usuarios) {
      await ctx.db.delete(usuario._id);
    }
    console.log(`  ✅ ${usuarios.length} usuários removidos`);

    // Limpar funcionários
    const funcionarios = await ctx.db.query("funcionarios").collect();
    for (const funcionario of funcionarios) {
      await ctx.db.delete(funcionario._id);
    }
    console.log(`  ✅ ${funcionarios.length} funcionários removidos`);

    // Limpar símbolos
    const simbolos = await ctx.db.query("simbolos").collect();
    for (const simbolo of simbolos) {
      await ctx.db.delete(simbolo._id);
    }
    console.log(`  ✅ ${simbolos.length} símbolos removidos`);

    // Limpar solicitações de acesso
    const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect();
    for (const solicitacao of solicitacoes) {
      await ctx.db.delete(solicitacao._id);
    }
    console.log(`  ✅ ${solicitacoes.length} solicitações removidas`);

    // Limpar menu-permissões
    const menuPermissoes = await ctx.db.query("menuPermissoes").collect();
    for (const mp of menuPermissoes) {
      await ctx.db.delete(mp._id);
    }
    console.log(`  ✅ ${menuPermissoes.length} menu-permissões removidas`);

    // Limpar menu-permissões personalizadas
    const menuPermissoesPersonalizadas = await ctx.db.query("menuPermissoesPersonalizadas").collect();
    for (const mpp of menuPermissoesPersonalizadas) {
      await ctx.db.delete(mpp._id);
    }
    console.log(`  ✅ ${menuPermissoesPersonalizadas.length} menu-permissões personalizadas removidas`);

    // Limpar role-permissões
    const rolePermissoes = await ctx.db.query("rolePermissoes").collect();
    for (const rp of rolePermissoes) {
      await ctx.db.delete(rp._id);
    }
    console.log(`  ✅ ${rolePermissoes.length} role-permissões removidas`);

    // Limpar permissões
    const permissoes = await ctx.db.query("permissoes").collect();
    for (const permissao of permissoes) {
      await ctx.db.delete(permissao._id);
    }
    console.log(`  ✅ ${permissoes.length} permissões removidas`);

    // Limpar roles
    const roles = await ctx.db.query("roles").collect();
    for (const role of roles) {
      await ctx.db.delete(role._id);
    }
    console.log(`  ✅ ${roles.length} roles removidas`);

    console.log("✨ Banco de dados limpo!");
    return null;
  },
});

