import { query } from "./_generated/server";
import { v } from "convex/values";

// Obter estatísticas gerais do sistema
export const getStats = query({
  args: {},
  returns: v.object({
    totalFuncionarios: v.number(),
    totalSimbolos: v.number(),
    totalSolicitacoesAcesso: v.number(),
    solicitacoesPendentes: v.number(),
    funcionariosAtivos: v.number(),
    funcionariosDesligados: v.number(),
    cargoComissionado: v.number(),
    funcaoGratificada: v.number(),
  }),
  handler: async (ctx) => {
    // Contar funcionários
    const funcionarios = await ctx.db.query("funcionarios").collect();
    const totalFuncionarios = funcionarios.length;
    
    // Funcionários ativos (sem data de desligamento)
    const funcionariosAtivos = funcionarios.filter(
      (f) => !f.desligamentoData
    ).length;
    
    // Funcionários desligados
    const funcionariosDesligados = funcionarios.filter(
      (f) => f.desligamentoData
    ).length;

    // Contar por tipo de símbolo
    const cargoComissionado = funcionarios.filter(
      (f) => f.simboloTipo === "cargo_comissionado"
    ).length;
    
    const funcaoGratificada = funcionarios.filter(
      (f) => f.simboloTipo === "funcao_gratificada"
    ).length;

    // Contar símbolos
    const simbolos = await ctx.db.query("simbolos").collect();
    const totalSimbolos = simbolos.length;

    // Contar solicitações de acesso
    const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect();
    const totalSolicitacoesAcesso = solicitacoes.length;
    
    const solicitacoesPendentes = solicitacoes.filter(
      (s) => s.status === "pendente"
    ).length;

    return {
      totalFuncionarios,
      totalSimbolos,
      totalSolicitacoesAcesso,
      solicitacoesPendentes,
      funcionariosAtivos,
      funcionariosDesligados,
      cargoComissionado,
      funcaoGratificada,
    };
  },
});

// Obter atividades recentes (últimas 24 horas)
export const getRecentActivity = query({
  args: {},
  returns: v.object({
    funcionariosCadastrados24h: v.number(),
    solicitacoesAcesso24h: v.number(),
    simbolosCadastrados24h: v.number(),
  }),
  handler: async (ctx) => {
    const now = Date.now();
    const last24h = now - 24 * 60 * 60 * 1000;

    // Funcionários cadastrados nas últimas 24h
    const funcionarios = await ctx.db.query("funcionarios").collect();
    const funcionariosCadastrados24h = funcionarios.filter(
      (f) => f._creationTime >= last24h
    ).length;

    // Solicitações de acesso nas últimas 24h
    const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect();
    const solicitacoesAcesso24h = solicitacoes.filter(
      (s) => s.dataSolicitacao >= last24h
    ).length;

    // Símbolos cadastrados nas últimas 24h
    const simbolos = await ctx.db.query("simbolos").collect();
    const simbolosCadastrados24h = simbolos.filter(
      (s) => s._creationTime >= last24h
    ).length;

    return {
      funcionariosCadastrados24h,
      solicitacoesAcesso24h,
      simbolosCadastrados24h,
    };
  },
});

// Obter distribuição de funcionários por cidade
export const getFuncionariosPorCidade = query({
  args: {},
  returns: v.array(
    v.object({
      cidade: v.string(),
      quantidade: v.number(),
    })
  ),
  handler: async (ctx) => {
    const funcionarios = await ctx.db.query("funcionarios").collect();
    
    const cidadesMap: Record<string, number> = {};
    
    for (const func of funcionarios) {
      if (!func.desligamentoData) {
        cidadesMap[func.cidade] = (cidadesMap[func.cidade] || 0) + 1;
      }
    }

    const result = Object.entries(cidadesMap)
      .map(([cidade, quantidade]) => ({ cidade, quantidade }))
      .sort((a, b) => b.quantidade - a.quantidade)
      .slice(0, 5); // Top 5 cidades

    return result;
  },
});

// Obter evolução de cadastros por mês
export const getEvolucaoCadastros = query({
  args: {},
  returns: v.array(
    v.object({
      mes: v.string(),
      funcionarios: v.number(),
      solicitacoes: v.number(),
    })
  ),
  handler: async (ctx) => {
    const funcionarios = await ctx.db.query("funcionarios").collect();
    const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect();

    const now = new Date();
    const meses: Array<{ mes: string; funcionarios: number; solicitacoes: number }> = [];

    // Últimos 6 meses
    for (let i = 5; i >= 0; i--) {
      const date = new Date(now.getFullYear(), now.getMonth() - i, 1);
      const nextDate = new Date(now.getFullYear(), now.getMonth() - i + 1, 1);
      
      const mesNome = date.toLocaleDateString("pt-BR", {
        month: "short",
        year: "2-digit",
      });

      const funcCount = funcionarios.filter(
        (f) => f._creationTime >= date.getTime() && f._creationTime < nextDate.getTime()
      ).length;

      const solCount = solicitacoes.filter(
        (s) => s.dataSolicitacao >= date.getTime() && s.dataSolicitacao < nextDate.getTime()
      ).length;

      meses.push({
        mes: mesNome,
        funcionarios: funcCount,
        solicitacoes: solCount,
      });
    }

    return meses;
  },
});

