// Numeração por subgrupo: cada grupo de permissões recebe uma letra e seus
// itens são numerados dentro do próprio grupo (a1, a2..., c1, c2...). Assim,
// incluir um novo item renumera apenas o grupo dele, sem afetar os demais.
// As letras seguem a ordem dos menus em FormEditPerfil; "b", "d", "h", "i" e
// "j" pertencem aos grupos dinâmicos (Menu, Linha Pendências, Gráficos, Abas
// do Card e Menu dentro de Configurações), que numeram suas próprias linhas.
const prefixarNumeracao = (
  letra: string,
  descricoes: Record<string, string>
): Record<string, string> =>
  Object.fromEntries(
    Object.entries(descricoes).map(([permissao, descricao], index) => [
      permissao,
      `${letra}${index + 1}. ${descricao}`,
    ])
  );

// permissões gerais
export const Perm_Gerais = {
  TodosContatos: "visualiza_todos_contatos_perfil",
  TodasAgendas: "visualiza_todas_agendas_perfil",
  HistoricoGeral: "visualiza_historico_geral_perfil",
  SimuladorFinanceiro: "visualiza_simulador_financeiro_perfil",
  Lixeira: "permite_lixeira_perfil",
  EditarConfigEtapa: "visualiza_config_etapa_perfil",
  EditarConfigFluxo: "edita_funis_perfil",
  EditarConfigGeral: "edita_cfgGerais_perfil",
  TodosNegociosEtapa: "visualiza_total_negocios_etapa_perfil",
  TodosValoresEtapa: "visualiza_total_valores_etapa_perfil",
  TodosTotalizadoresFluxo: "visualiza_totalizadores_fluxo",
  VisualizaBotaoNovaLoja: "visualiza_btn_nova_perfil",
  PermiteExclusaoLoja: "permite_exclusao_loja_perfil",
  // RelatorioItensKit: "permite_relatorio_itens_kit",
  // FatorPrecificacaoDistribuidor: "visualiza_fator_precificacao",
};
// Permite a Exclusão de Loja
export const Desc_Perm_Gerais = prefixarNumeracao("a", {
  [Perm_Gerais.TodosContatos]: "Visualizar Todos Contatos",
  [Perm_Gerais.TodasAgendas]: "Visualizar Todas Agendas",
  [Perm_Gerais.HistoricoGeral]: "Visualizar Histórico Geral",
  [Perm_Gerais.SimuladorFinanceiro]: "Acessar Simulador Financiamento",
  [Perm_Gerais.Lixeira]: "Acessar a Lixeira",
  [Perm_Gerais.EditarConfigEtapa]: "Editar as Configurações das Etapas",
  [Perm_Gerais.EditarConfigFluxo]: "Editar as Configurações dos Fluxos",
  [Perm_Gerais.EditarConfigGeral]: "Editar as Configurações Gerais",
  [Perm_Gerais.TodosNegociosEtapa]:
    "Visualizar quantidade de negócios por etapas",
  [Perm_Gerais.TodosValoresEtapa]: "Visualizar valores de negócios por etapas",
  [Perm_Gerais.TodosTotalizadoresFluxo]: "Visualizar totalizadores do fluxo",
  [Perm_Gerais.VisualizaBotaoNovaLoja]: "Visualizar botão de nova loja",
  [Perm_Gerais.PermiteExclusaoLoja]: "Permite a Exclusão de Loja",
  // [Perm_Gerais.RelatorioItensKit]: "Acessar Relatório de Itens do Kit",
  // [Perm_Gerais.FatorPrecificacaoDistribuidor]: "Visualizar fator de precificação distribuidor",
});

// permissões cards
// Apenas as permissões gerais do card (c1..c11). As permissões de realizar /
// estornar pendência ficam na tabela `permissoes_perfil` (categoria
// "linha_pendencias"), exibidas no menu "d. Linha Pendências" agrupadas por
// tipo de negócio.
export const Perm_Cards = {
  VisualizarAcoesCard: "visualiza_acoes_card_perfil",
  AlterarResponsaveis: "permite_alterar_responsaveis",
  EditarContato: "permite_editar_contato_perfil",
  EditarNomeNegocio: "permite_editar_nome_negocio_perfil",
  EditarLocalizacao: "permite_editar_localizacao_perfil",
  EditarPrioridadeNegocio: "permite_editar_prioridade_negocio_perfil",
  ExcluirAnexo: "permite_excluir_anexo_perfil",
  AlterarInstaladorOS: "permite_alterar_instalador_os_perfil",
  ReagendarOS: "permite_reagendar_os_perfil",
  VisualizarCustoOS: "permite_visualizar_custo_os_perfil",
  // Não é filtrada por tipo de negócio, por isso continua aqui e não na
  // categoria "linha_pendencias" de `permissoes_perfil`.
  ExcluirProjeto: "permite_excluir_projeto_perfil",
  VisualizaPendenciasRealizadas: "visualiza_pendencias_realizadas_perfil",
  EditarFinalizacaoVenda: "editar_data_finalizacao_venda_perfil"
};
// A ordem das entradas define a numeração; manter igual à ordem de Perm_Cards.
export const Desc_Perm_Cards = prefixarNumeracao("c", {
  [Perm_Cards.VisualizarAcoesCard]: "Permite Visualizar Ações do Card",
  [Perm_Cards.AlterarResponsaveis]: "Permite Alterar Responsável",
  [Perm_Cards.EditarContato]: "Permite Editar Contato",
  [Perm_Cards.EditarNomeNegocio]: "Permite Editar Nome do Negócio",
  [Perm_Cards.EditarLocalizacao]: "Permite Editar Localização do Negócio",
  [Perm_Cards.EditarPrioridadeNegocio]: "Permite Editar Prioridade do Negócio",
  [Perm_Cards.ExcluirAnexo]: "Permite Excluir Anexo",
  [Perm_Cards.AlterarInstaladorOS]: "Permite Alterar Instalador da OS",
  [Perm_Cards.ReagendarOS]: "Permite Realizar Reagendamento de OS",
  [Perm_Cards.VisualizarCustoOS]: "Permite Visualizar Custo da OS",
  [Perm_Cards.ExcluirProjeto]: "Permite Excluir Projeto definitivamente no Fluxo de Perdas",
  [Perm_Cards.VisualizaPendenciasRealizadas]:
    "Permite Visualizar Pendências Realizadas",
  [Perm_Cards.EditarFinalizacaoVenda]:
    "Permite Editar Data da Finalização da Venda",
});

// As permissões de realizar / estornar pendência (menu "d. Linha Pendências")
// NÃO ficam mais aqui: vêm das tabelas `permissoes_perfil` /
// `categoria_permissoes_perfil` (categoria "linha_pendencias"), carregadas por
// requests/CRUD/Perfil/permissoesPerfilCadastradas.ts. Para liberar a permissão
// de uma pendência nova basta inserir a linha na tabela - ver
// back-end/processos/scripts/permissoes_perfil.sql.

// permissões propostas
export const Perm_Propostas = {
  EditaSombreamento: "edita_sombreamento_perfil",
  EditaPerformanceRatio: "edita_performance_ratio_perfil",
  GerarProposta: "permite_gerar_proposta_perfil",
  AprovarProposta: "permite_aprovar_proposta_perfil",
  CancelarProposta: "cancelar_proposta_perfil",
  PermiteAlterarInversoresProposta:
    "permite_alterar_inversores_proposta_perfil",
  AlterarValorPropostaAposGeracao: "alterar_valor_proposta_apos_geracao_perfil",
  AlterarValidadeProposta: "alterar_validade_proposta_perfil",
  ExcluirPropostas: "permite_excluir_proposta_perfil",
};
export const Desc_Perm_Propostas = prefixarNumeracao("e", {
  [Perm_Propostas.EditaSombreamento]: "Permite Editar Sombreamento",
  [Perm_Propostas.EditaPerformanceRatio]: "Permite Editar Performance Ratio",
  [Perm_Propostas.GerarProposta]: "Permite Gerar Proposta",
  [Perm_Propostas.AprovarProposta]: "Permite Aprovar Proposta",
  [Perm_Propostas.CancelarProposta]: "Permite Cancelar Proposta",
  [Perm_Propostas.PermiteAlterarInversoresProposta]:
    "Permite Alterar Inversores na Proposta",
  [Perm_Propostas.AlterarValorPropostaAposGeracao]:
    "Permite Alterar o Valor da Proposta após Geração",
  [Perm_Propostas.AlterarValidadeProposta]:
    "Permite Alterar a Validade da Proposta",
  [Perm_Propostas.ExcluirPropostas]: "Permite Excluir Propostas",
});

// permissões contratos
export const Perm_Contratos = {
  GerarContrato: "permite_gerar_contrato_perfil",
  AprovarContrato: "permite_aprovar_contrato_perfil",
  CancelarContrato: "cancelar_contrato_perfil",
  ExcluirContrato: "excluir_contrato_perfil",
  AlterarDatasContrato: "alterar_datas_contrato_perfil",
};
export const Desc_Perm_Contratos = prefixarNumeracao("f", {
  [Perm_Contratos.GerarContrato]: "Permite Gerar Contrato",
  [Perm_Contratos.AprovarContrato]: "Permite Aprovar Contrato",
  [Perm_Contratos.CancelarContrato]: "Permite Cancelar Contrato",
  [Perm_Contratos.ExcluirContrato]: "Permite Excluir Contrato",
  [Perm_Contratos.AlterarDatasContrato]: "Permite Alterar Datas do Contrato",
});

// permissões comissões
export const Perm_Comissoes = {
  PreApurarComissoes: "permite_pre_apurar_comissoes_perfil",
  EstornarPreApuracaoComissoes:
    "permite_estornar_pre_apuracao_comissoes_perfil",
  ApurarComissoes: "permite_apurar_comissoes_perfil",
  EstornarApuracaoComissoes: "permite_estornar_apuracao_comissoes_perfil",
  PagarComissoes: "permite_pagar_comissoes_perfil",
  EstornarPagamentoComissoes: "permite_estornar_pagamento_comissoes_perfil",
  PermiteVisualizarTodasComissoes: "permite_visualizar_todas_comissoes_perfil",
  PermiteLancamentoManualNasComissoes:
    "permite_lancamento_manual_comissoes_perfil",
  PermiteCancelarLancamentoManualNasComissoes:
    "permite_cancelar_lancamento_manual_comissoes_perfil",
};
export const Desc_Perm_Comissoes = prefixarNumeracao("g", {
  [Perm_Comissoes.PreApurarComissoes]: "Permite Pré-Apurar Comissões",
  [Perm_Comissoes.EstornarPreApuracaoComissoes]:
    "Permite Estornar Pré-Apuração de Comissões",
  [Perm_Comissoes.ApurarComissoes]: "Permite Apurar Comissões",
  [Perm_Comissoes.EstornarApuracaoComissoes]:
    "Permite Estornar Apuração de Comissões",
  [Perm_Comissoes.PagarComissoes]: "Permite Pagar Comissões",
  [Perm_Comissoes.EstornarPagamentoComissoes]:
    "Permite Estornar Pagamento de Comissões",
  [Perm_Comissoes.PermiteVisualizarTodasComissoes]:
    "Permite Visualizar Todas as Comissões",
  [Perm_Comissoes.PermiteLancamentoManualNasComissoes]:
    "Permite Lançamento Manual nas Comissões",
  [Perm_Comissoes.PermiteCancelarLancamentoManualNasComissoes]:
    "Permite Cancelar Lançamento Manual nas Comissões",
});

// Options
interface Option {
  label: string;
  value: string;
}
export const getOptionsFromEnumPermision = (
  enumObj: any,
  descObj: any
): Option[] => {
  return Object.keys(enumObj).map((key) => ({
    label: descObj[enumObj[key]],
    value: enumObj[key],
  }));
};
