import { internalMutation, mutation, query } from "./_generated/server";
import { internal } from "./_generated/api";
import { v } from "convex/values";
import { hashPassword } from "./auth/utils";
import { Id } from "./_generated/dataModel";

// 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 roleUsuario = await ctx.db.insert("roles", {
      nome: "usuario",
      descricao: "Usuário Padrão",
      nivel: 3,
      setor: undefined,
      customizado: false,
      editavel: false,
    });
    console.log("  ✅ Role criada: usuario (Nível 3 - Padrão)");

    // 2. Criar Símbolos (Cargos)
    console.log("💰 Criando símbolos...");
    const simbolosMap = new Map<string, Id<"simbolos">>();

    for (const simbolo of simbolosData) {
      const simboloId = await ctx.db.insert("simbolos", {
        nome: simbolo.nome,
        descricao: simbolo.descricao,
        tipo: simbolo.tipo,
        valor: simbolo.valor,
        repValor: simbolo.repValor || "",
        vencValor: simbolo.vencValor || "",
      });
      simbolosMap.set(simbolo.nome, simboloId);
      console.log(`  ✅ Símbolo criado: ${simbolo.nome}`);
    }

    // 3. Criar Funcionários
    console.log("👥 Criando funcionários...");
    const funcionariosMap = new Map<string, Id<"funcionarios">>();

    for (const funcionario of funcionariosData) {
      const simboloId = simbolosMap.get(funcionario.simboloNome);
      if (!simboloId) {
        console.log(
          `  ❌ 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 Id<"simbolos">,
        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", {
        senhaHash: senhaInicial,
        nome: funcionario.nome,
        email: funcionario.email,
        funcionarioId: funcId as Id<"funcionarios">,
        roleId: roleUsuario,
        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) {
      const dadosSolicitacao: {
        nome: string;
        matricula: string;
        email: string;
        telefone: string;
        status: "pendente" | "aprovado" | "rejeitado";
        dataSolicitacao: number;
        dataResposta?: number;
        observacoes?: string;
      } = {
        nome: solicitacao.nome,
        matricula: solicitacao.matricula,
        email: solicitacao.email,
        telefone: solicitacao.telefone,
        status: solicitacao.status,
        dataSolicitacao: solicitacao.dataSolicitacao,
      };

      if (solicitacao.dataResposta) {
        dadosSolicitacao.dataResposta = solicitacao.dataResposta;
      }

      if (solicitacao.observacoes) {
        dadosSolicitacao.observacoes = solicitacao.observacoes;
      }

      await ctx.db.insert("solicitacoesAcesso", dadosSolicitacao);
      console.log(
        `  ✅ Solicitação criada: ${solicitacao.nome} (${solicitacao.status})`
      );
    }

    console.log("✨ Seed do banco de dados concluído com sucesso!");
    return null;
  }
});

/**
 * Mutation pública para popular o banco de dados com os dados de seed
 * Permite executar via CLI: `npx convex run seed:popularBanco`
 */
export const popularBanco = mutation({
  args: {},
  returns: v.null(),
  handler: async (ctx) => {
    console.log("🌱 Executando popularBanco (wrapper público para seedDatabase)...");
    // Chama a internalMutation para reaproveitar a lógica de seed
    await ctx.runMutation(internal.seed.seedDatabase, {});
    console.log("✅ Seed concluído pelo wrapper público");
    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 em ordem (respeitando dependências)

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

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

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

    // 2. Sistema de chat
    const leituras = await ctx.db.query("leituras").collect();
    for (const leitura of leituras) {
      await ctx.db.delete(leitura._id);
    }
    console.log(`  ✅ ${leituras.length} leituras removidas`);

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

    const digitando = await ctx.db.query("digitando").collect();
    for (const d of digitando) {
      await ctx.db.delete(d._id);
    }
    console.log(`  ✅ ${digitando.length} registros de digitando removidos`);

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

    // 3. Notificações
    const notificacoes = await ctx.db.query("notificacoes").collect();
    for (const notificacao of notificacoes) {
      await ctx.db.delete(notificacao._id);
    }
    console.log(`  ✅ ${notificacoes.length} notificações removidas`);

    const notificacoesEmail = await ctx.db.query("notificacoesEmail").collect();
    for (const email of notificacoesEmail) {
      await ctx.db.delete(email._id);
    }
    console.log(
      `  ✅ ${notificacoesEmail.length} notificações de email removidas`
    );

    const notificacoesFerias = await ctx.db
      .query("notificacoesFerias")
      .collect();
    for (const notif of notificacoesFerias) {
      await ctx.db.delete(notif._id);
    }
    console.log(
      `  ✅ ${notificacoesFerias.length} notificações de férias removidas`
    );

    // 4. Férias e períodos aquisitivos
    const solicitacoesFerias = await ctx.db
      .query("solicitacoesFerias")
      .collect();
    for (const solicitacao of solicitacoesFerias) {
      await ctx.db.delete(solicitacao._id);
    }
    console.log(
      `  ✅ ${solicitacoesFerias.length} solicitações de férias removidas`
    );

    const periodosAquisitivos = await ctx.db
      .query("periodosAquisitivos")
      .collect();
    for (const periodo of periodosAquisitivos) {
      await ctx.db.delete(periodo._id);
    }
    console.log(
      `  ✅ ${periodosAquisitivos.length} períodos aquisitivos removidos`
    );

    // 5. Atestados
    const atestados = await ctx.db.query("atestados").collect();
    for (const atestado of atestados) {
      await ctx.db.delete(atestado._id);
    }
    console.log(`  ✅ ${atestados.length} atestados removidos`);

    // 6. Times e membros
    const timesMembros = await ctx.db.query("timesMembros").collect();
    for (const membro of timesMembros) {
      await ctx.db.delete(membro._id);
    }
    console.log(`  ✅ ${timesMembros.length} membros de times removidos`);

    const times = await ctx.db.query("times").collect();
    for (const time of times) {
      await ctx.db.delete(time._id);
    }
    console.log(`  ✅ ${times.length} times removidos`);

    // 7. Cursos
    const cursos = await ctx.db.query("cursos").collect();
    for (const curso of cursos) {
      await ctx.db.delete(curso._id);
    }
    console.log(`  ✅ ${cursos.length} cursos removidos`);

    // 8. Bloqueios de usuários
    const bloqueiosUsuarios = await ctx.db.query("bloqueiosUsuarios").collect();
    for (const bloqueio of bloqueiosUsuarios) {
      await ctx.db.delete(bloqueio._id);
    }
    console.log(
      `  ✅ ${bloqueiosUsuarios.length} bloqueios de usuários removidos`
    );

    // 9. Perfis customizados
    
    // 10. Templates de mensagens
    const templatesMensagens = await ctx.db
      .query("templatesMensagens")
      .collect();
    for (const template of templatesMensagens) {
      await ctx.db.delete(template._id);
    }
    console.log(
      `  ✅ ${templatesMensagens.length} templates de mensagens removidos`
    );

    // 11. Configurações
    const configuracaoEmail = await ctx.db.query("configuracaoEmail").collect();
    for (const config of configuracaoEmail) {
      await ctx.db.delete(config._id);
    }
    console.log(
      `  ✅ ${configuracaoEmail.length} configurações de email removidas`
    );

    const configuracaoAcesso = await ctx.db
      .query("configuracaoAcesso")
      .collect();
    for (const config of configuracaoAcesso) {
      await ctx.db.delete(config._id);
    }
    console.log(
      `  ✅ ${configuracaoAcesso.length} configurações de acesso removidas`
    );

    // 12. Monitoramento
    const alertHistory = await ctx.db.query("alertHistory").collect();
    for (const alert of alertHistory) {
      await ctx.db.delete(alert._id);
    }
    console.log(`  ✅ ${alertHistory.length} histórico de alertas removido`);

    const alertConfigurations = await ctx.db
      .query("alertConfigurations")
      .collect();
    for (const alert of alertConfigurations) {
      await ctx.db.delete(alert._id);
    }
    console.log(
      `  ✅ ${alertConfigurations.length} configurações de alertas removidas`
    );

    const systemMetrics = await ctx.db.query("systemMetrics").collect();
    for (const metric of systemMetrics) {
      await ctx.db.delete(metric._id);
    }
    console.log(`  ✅ ${systemMetrics.length} métricas do sistema removidas`);

    // 13. 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`);

    // 14. Menu-permissões personalizadas
    
    // 15. Menu-permissões
    
    // 16. 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`);

    // 17. 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`);

    // 18. Usuários (deve vir antes de roles se houver referência)
    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`);

    // 19. 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`);

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

    // 21. 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`);

    // 22. Roles (deve vir por último se outras tabelas referenciam)
    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`);

    // 23. Todos (tabela de exemplo)
    const todos = await ctx.db.query("todos").collect();
    for (const todo of todos) {
      await ctx.db.delete(todo._id);
    }
    console.log(`  ✅ ${todos.length} todos removidos`);

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

/**
 * Mutation pública para limpar o banco de dados (para uso via CLI)
 * ATENÇÃO: Esta função deleta TODOS os dados do banco!
 */
export const limparBanco = mutation({
  args: {},
  returns: v.null(),
  handler: async (ctx) => {
    // Executa diretamente a limpeza (mesmo código da internalMutation)
    console.log("🗑️  Limpando banco de dados...");

    // Limpar em ordem (respeitando dependências)

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

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

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

    // 2. Sistema de chat
    const leituras = await ctx.db.query("leituras").collect();
    for (const leitura of leituras) {
      await ctx.db.delete(leitura._id);
    }
    console.log(`  ✅ ${leituras.length} leituras removidas`);

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

    const digitando = await ctx.db.query("digitando").collect();
    for (const d of digitando) {
      await ctx.db.delete(d._id);
    }
    console.log(`  ✅ ${digitando.length} registros de digitando removidos`);

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

    // 3. Notificações
    const notificacoes = await ctx.db.query("notificacoes").collect();
    for (const notificacao of notificacoes) {
      await ctx.db.delete(notificacao._id);
    }
    console.log(`  ✅ ${notificacoes.length} notificações removidas`);

    const notificacoesEmail = await ctx.db.query("notificacoesEmail").collect();
    for (const email of notificacoesEmail) {
      await ctx.db.delete(email._id);
    }
    console.log(
      `  ✅ ${notificacoesEmail.length} notificações de email removidas`
    );

    const notificacoesFerias = await ctx.db
      .query("notificacoesFerias")
      .collect();
    for (const notif of notificacoesFerias) {
      await ctx.db.delete(notif._id);
    }
    console.log(
      `  ✅ ${notificacoesFerias.length} notificações de férias removidas`
    );

    // 4. Férias e períodos aquisitivos
    const solicitacoesFerias = await ctx.db
      .query("solicitacoesFerias")
      .collect();
    for (const solicitacao of solicitacoesFerias) {
      await ctx.db.delete(solicitacao._id);
    }
    console.log(
      `  ✅ ${solicitacoesFerias.length} solicitações de férias removidas`
    );

    const periodosAquisitivos = await ctx.db
      .query("periodosAquisitivos")
      .collect();
    for (const periodo of periodosAquisitivos) {
      await ctx.db.delete(periodo._id);
    }
    console.log(
      `  ✅ ${periodosAquisitivos.length} períodos aquisitivos removidos`
    );

    // 5. Atestados
    const atestados = await ctx.db.query("atestados").collect();
    for (const atestado of atestados) {
      await ctx.db.delete(atestado._id);
    }
    console.log(`  ✅ ${atestados.length} atestados removidos`);

    // 6. Times e membros
    const timesMembros = await ctx.db.query("timesMembros").collect();
    for (const membro of timesMembros) {
      await ctx.db.delete(membro._id);
    }
    console.log(`  ✅ ${timesMembros.length} membros de times removidos`);

    const times = await ctx.db.query("times").collect();
    for (const time of times) {
      await ctx.db.delete(time._id);
    }
    console.log(`  ✅ ${times.length} times removidos`);

    // 7. Cursos
    const cursos = await ctx.db.query("cursos").collect();
    for (const curso of cursos) {
      await ctx.db.delete(curso._id);
    }
    console.log(`  ✅ ${cursos.length} cursos removidos`);

    // 8. Bloqueios de usuários
    const bloqueiosUsuarios = await ctx.db.query("bloqueiosUsuarios").collect();
    for (const bloqueio of bloqueiosUsuarios) {
      await ctx.db.delete(bloqueio._id);
    }
    console.log(
      `  ✅ ${bloqueiosUsuarios.length} bloqueios de usuários removidos`
    );

    // 9. Perfis customizados (já está no código da internalMutation mas vazio)
    
    // 10. Templates de mensagens
    const templatesMensagens = await ctx.db
      .query("templatesMensagens")
      .collect();
    for (const template of templatesMensagens) {
      await ctx.db.delete(template._id);
    }
    console.log(
      `  ✅ ${templatesMensagens.length} templates de mensagens removidos`
    );

    // 11. Configurações
    const configuracaoEmail = await ctx.db.query("configuracaoEmail").collect();
    for (const config of configuracaoEmail) {
      await ctx.db.delete(config._id);
    }
    console.log(
      `  ✅ ${configuracaoEmail.length} configurações de email removidas`
    );

    const configuracaoAcesso = await ctx.db
      .query("configuracaoAcesso")
      .collect();
    for (const config of configuracaoAcesso) {
      await ctx.db.delete(config._id);
    }
    console.log(
      `  ✅ ${configuracaoAcesso.length} configurações de acesso removidas`
    );

    // 12. Monitoramento
    const alertHistory = await ctx.db.query("alertHistory").collect();
    for (const alert of alertHistory) {
      await ctx.db.delete(alert._id);
    }
    console.log(`  ✅ ${alertHistory.length} histórico de alertas removido`);

    const alertConfigurations = await ctx.db
      .query("alertConfigurations")
      .collect();
    for (const alert of alertConfigurations) {
      await ctx.db.delete(alert._id);
    }
    console.log(
      `  ✅ ${alertConfigurations.length} configurações de alertas removidas`
    );

    const systemMetrics = await ctx.db.query("systemMetrics").collect();
    for (const metric of systemMetrics) {
      await ctx.db.delete(metric._id);
    }
    console.log(`  ✅ ${systemMetrics.length} métricas do sistema removidas`);

    // 13. 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`);

    // 14. Menu-permissões personalizadas (já está no código da internalMutation mas vazio)
    
    // 15. Menu-permissões (já está no código da internalMutation mas vazio)
    
    // 16. 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`);

    // 17. 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`);

    // 18. Usuários (deve vir antes de roles se houver referência)
    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`);

    // 19. 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`);

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

    // 21. 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`);

    // 22. Roles (deve vir por último se outras tabelas referenciam)
    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`);

    // 23. Todos (tabela de exemplo)
    const todos = await ctx.db.query("todos").collect();
    for (const todo of todos) {
      await ctx.db.delete(todo._id);
    }
    console.log(`  ✅ ${todos.length} todos removidos`);

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

/**
 * Query para verificar quantos registros existem no banco
 */
export const verificarBanco = query({
  args: {},
  returns: v.object({
    usuarios: v.number(),
    funcionarios: v.number(),
    roles: v.number(),
    simbolos: v.number(),
    total: v.number(),
  }),
  handler: async (ctx) => {
    const usuarios = await ctx.db.query("usuarios").collect();
    const funcionarios = await ctx.db.query("funcionarios").collect();
    const roles = await ctx.db.query("roles").collect();
    const simbolos = await ctx.db.query("simbolos").collect();
    
    return {
      usuarios: usuarios.length,
      funcionarios: funcionarios.length,
      roles: roles.length,
      simbolos: simbolos.length,
      total: usuarios.length + funcionarios.length + roles.length + simbolos.length,
    };
  },
});
