import { listarRelacionamenosRapidos } from "@/requests/common/RelacionamentosRapidos/listarRelacionamenosRapidos";
import { listarCamposPersonalizadosRelacionamentos } from "@/requests/CRUD/CamposPersonalizados/listarCamposPersonalizados";
import { capitalizeMonth, getDateTimeBrasil } from "@/utils";
import { Template } from "@pdfme/common";
import { usePathname } from "next/navigation";
import {
  ReactNode,
  createContext,
  useContext,
  useEffect,
  useState,
} from "react";

interface IProviderProps {
  children: ReactNode;
}

interface IOrdemServicoProviderData {
  relacionamentosOrdemServico: {
    name: string;
    text: string;
    relacionamento: any;
    grupo_relacionamento_rapido?: any;
  }[];
  camposRelacionamentosOrdensServico: {
    name: string;
    text: string;
    tiposNegocio_relacionamento_rapido?: string;
    mostrarDocPersonalizado_relacionamento_rapido?: string;
    relacionamento: any;
    grupo_relacionamento_rapido?: any;
  }[];
  camposPersonalizadosRelacionamentosOrdensServico: {
    name: string;
    text: string;
    relacionamento: any;
    grupo_relacionamento_rapido?: any;
  }[];
  getRelacionamentosRapidosOrdensServico: () => void;
  relacionarDadosOrdemServico: (
    template: Template,
    dadosCliente: any
  ) => Promise<Template>;
}

const OrdemServicoContext = createContext({} as IOrdemServicoProviderData);

export const OrdemServicoProvider = ({ children }: IProviderProps) => {
  const pathname = usePathname() as any;

  const [relacionamentosOrdemServico, setRelacionamentosOrdemServico] =
    useState<any>([]);
  const [relacionamentos, setRelacionamentos] = useState<any>([]);
  const [
    camposRelacionamentosOrdensServico,
    setCamposRelacionamentosOrdensServico,
  ] = useState<any>([]);
  const [
    camposPersonalizadosRelacionamentosOrdensServico,
    setCamposPersonalizadosRelacionamentosOrdensServico,
  ] = useState<any>([]);

  const getRelacionamentosRapidosOrdensServico = () => {
    const novosRelacionamentosOrdensServico: any[] = [
      {
        name: "nome_cliente",
        text: "Nome do cliente do contrato",
        relacionamento: "nome_cliente",
      },
      {
        name: "nome_vendedor",
        text: "Nome do vendedor do contrato",
        relacionamento: "nome_vendedor",
      },
      {
        name: "nome_supervisor",
        text: "Nome do supervisor do contrato",
        relacionamento: "nome_supervisor",
      },
      {
        name: "cliente_cpf",
        text: "CPF do cliente do contrato",
        relacionamento: "cpfcnpj_cliente",
      },
      {
        name: "numero_contrato",
        text: "Número do contrato",
        relacionamento: "contratoId",
      },
      {
        name: "numero_negocio",
        text: "Número do negócio",
        relacionamento: "id_coleta_cliente",
      },
      {
        name: "revisao_contrato",
        text: "Revisão do contrato",
        relacionamento: "revisaoContrato",
      },
      {
        name: "data_atual",
        text: "Data atual",
        relacionamento: capitalizeMonth(
          getDateTimeBrasil({
            day: "2-digit",
            month: "long",
            year: "numeric",
            hour: undefined, // Define a hora como undefined para excluí-la
            minute: undefined, // Define os minutos como undefined para excluí-los
            second: undefined, // Define os segundos como undefined para excluí-los
          })
        ),
      },
      {
        name: "dia_numero",
        text: "Numero do dia atual",
        relacionamento: getDateTimeBrasil({
          year: undefined,
          month: undefined,
          day: "2-digit",
          hour: undefined,
          minute: undefined,
          second: undefined,
        }),
      },
      {
        name: "mes_numero",
        text: "Numero do mês atual",
        relacionamento: getDateTimeBrasil({
          year: undefined,
          month: "2-digit",
          day: undefined,
          hour: undefined,
          minute: undefined,
          second: undefined,
        }),
      },
      {
        name: "mes_extenso",
        text: "Mês atual escrito por extenso",
        relacionamento: getDateTimeBrasil({
          year: undefined,
          month: "long",
          day: undefined,
          hour: undefined,
          minute: undefined,
          second: undefined,
        }),
      },
      {
        name: "media_consumoTotal",
        text: "Média do consumo de energia total",
        relacionamento: "media_consumoTotal",
      },
      {
        name: "consumoTotal_anual",
        text: "consumo de energia total anual",
        relacionamento: "consumoTotal_anual",
      },
      // sasa start
      {
        name: "dias_cronograma_instalacao",
        text: "dias estimados de instalação",
        relacionamento: "dias_cronograma_instalacao",
      },
      {
        name: "endereco_loja",
        text: "endereco da loja",
        relacionamento: "endereco_loja",
      },
      {
        name: "cep_loja",
        text: "cep da loja",
        relacionamento: "cep_loja",
      },
      {
        name: "cidade_loja",
        text: "cidade da loja",
        relacionamento: "cidade_loja",
      },
      {
        name: "estado_loja",
        text: "estado da loja",
        relacionamento: "estado_loja",
      },
      {
        name: "proprietario_loja",
        text: "proprietario da loja",
        relacionamento: "proprietario_loja",
      },
      {
        name: "nome_loja",
        text: "nome da loja",
        relacionamento: "nome_loja",
      },
      {
        name: "mensagem_contratante",
        text: "mensagem do contratante",
        relacionamento: "mensagem_contratante",
      },
      {
        name: "email_loja",
        text: "email da loja",
        relacionamento: "email_loja",
      },
      {
        name: "tipoPessoa_cliente",
        text: "tipo pessoa cliente",
        relacionamento: "tipoPessoa_cliente",
      },
      // sasa end
      {
        name: "estimativa_geracao",
        text: "Média da estimativa de energia gerada mensalmente",
        relacionamento: "estimativa_geracao",
      },
      {
        name: "media_consumo_uc_geradora",
        text: "Média de Consumo da UC Geradora",
        relacionamento: "media_consumo_uc_geradora",
      },
      {
        name: "media_consumo_ucs_beneficiarias",
        text: "Média de Consumo das UCs Beneficiárias",
        relacionamento: "media_consumo_ucs_beneficiarias",
      },
      {
        name: "numero_uc_geradora",
        text: "Número da UC Geradora",
        relacionamento: "numero_uc_geradora",
      },
      {
        name: "qtd_expansivel_modulos",
        text: "Qtx máx de Módulos - qtd de Módulos",
        relacionamento: "qtd_expansivel_modulos",
      },
      {
        name: "ano_numero",
        text: "Numero do ano atual",
        relacionamento: getDateTimeBrasil({
          day: undefined,
          month: undefined,
          year: "numeric",
          hour: undefined, // Define a hora como undefined para excluí-la
          minute: undefined, // Define os minutos como undefined para excluí-los
          second: undefined, // Define os segundos como undefined para excluí-los
        }),
      },
      {
        name: "valor_total_pagamento",
        text: "Valor Total do Contrato",
        relacionamento: "valorTotal_proposta",
      },
      {
        name: "valor_extenso_proposta",
        text: "Valor Total do Contrato por extenso",
        relacionamento: "valor_extenso_proposta",
      },
      {
        name: "condicao_pagamento_proposta",
        text: "Condição de Pagamento",
        relacionamento: "condicao_pagamento_proposta",
      },
      {
        name: "tabela_kit_val",
        text: "Tabela de componentes do kit",
        relacionamento: "tabela_kit_val",
      },
      {
        name: "tabela_ucs",
        text: "Tabela de componentes das UCS",
        relacionamento: "tabela_ucs",
      },
      {
        name: "tabela_ubs",
        text: "Tabela de consumo das ubs",
        relacionamento: "tabela_ubs",
      },
      {
        name: "potencia_kit",
        text: "Potência do kit",
        relacionamento: "potencia_kit",
      },
      {
        name: "localizacao_instalacao",
        text: "Localização da instalação",
        relacionamento: "localizacao_instalacao",
      },
      {
        name: "numero_moradia_cliente",
        text: "Número da moradia do cliente",
        relacionamento: "nro_cliente",
      },
      {
        name: "cidade_moradia_cliente",
        text: "Cidade da moradia do cliente",
        relacionamento: "cidade_cliente",
      },
      {
        name: "estado_moradia_cliente",
        text: "Estado da moradia do cliente",
        relacionamento: "estado_cliente",
      },
      {
        name: "cep_moradia_cliente",
        text: "Cep da moradia do cliente",
        relacionamento: "cep_cliente",
      },
      {
        name: "rua_moradia_cliente",
        text: "Rua da moradia do cliente",
        relacionamento: "rua_cliente",
      },
      {
        name: "bairro_moradia_cliente",
        text: "Bairro da moradia do cliente",
        relacionamento: "bairro_cliente",
      },
      {
        name: "agencia_loja",
        text: "Agencia da loja",
        relacionamento: "agencia_loja",
      },
      {
        name: "conta_loja",
        text: "Conta da loja",
        relacionamento: "conta_loja",
      },
      {
        name: "pix_loja",
        text: "Pix da loja",
        relacionamento: "pix_loja",
      },
      {
        name: "complementos_bancarios_loja",
        text: "Complementos bancarios da loja",
        relacionamento: "complementos_bancarios_loja",
      },
      {
        name: "cnpj_loja",
        text: "Cnpj Loja",
        relacionamento: "cnpj_loja",
      },
      {
        name: "complemento_moradia_cliente",
        text: "Complemento da moradia do cliente",
        relacionamento: "comp_cliente",
      },
      {
        name: "razao_social_cliente",
        text: "Razão social do cliente",
        relacionamento: "nomeEmpresa_cliente",
      },
      {
        name: "cliente_cnpj",
        text: "CNPJ do cliente do contrato",
        relacionamento: "cpfcnpj_cliente",
      },
      {
        name: "rua_empresa_cliente",
        text: "Rua da empresa do cliente",
        relacionamento: "logradouroEmpresa_cliente",
      },
      {
        name: "numero_empresa_cliente",
        text: "Número do endereço da empresa do cliente",
        relacionamento: "numeroEmpresa",
      },
      {
        name: "complemento_empresa_cliente",
        text: "Complemento do endereço da empresa do cliente",
        relacionamento: "complementoEmpresa_cliente",
      },
      {
        name: "bairro_empresa_cliente",
        text: "Bairro do endereço da empresa do cliente",
        relacionamento: "bairroEmpresa_cliente",
      },
      {
        name: "cep_empresa_cliente",
        text: "Número do CEP do endereço da empresa do cliente",
        relacionamento: "cepEmpresa_cliente",
      },
      {
        name: "cidade_empresa_cliente",
        text: "Cidade do endereço da empresa do cliente",
        relacionamento: "cidadeEmpresa_cliente",
      },
      {
        name: "estado_empresa_cliente",
        text: "Estado do endereço da empresa do cliente",
        relacionamento: "ufEmpresa_cliente",
      },
      {
        name: "nome_responsavel_empresa_cliente",
        text: "Nome do responsável da empresa do cliente",
        relacionamento: "nomeResponsavelFisico_cliente",
      },
      {
        name: "cpf_responsavel_empresa_cliente",
        text: "CPF do responsável da empresa do cliente",
        relacionamento: "cpfResponsavel_cliente",
      },
      {
        name: "orientacao_proposta",
        text: "Primeira orientação dos módulos na proposta",
        relacionamento: "orientacao_proposta",
      },
      {
        name: "instalador_nome_empresa_terceirizada",
        text: "Nome da empresa terceirizada do instalador",
        relacionamento: "instalador_nome_empresa_terceirizada",
      },
      {
        name: "instalador_cnpj_empresa_terceirizada",
        text: "CNPJ da empresa do instalador",
        relacionamento: "instalador_cnpj_empresa_terceirizada",
      },
      {
        name: "instalador_rua_empresa_terceirizada",
        text: "Rua da empresa do instalador",
        relacionamento: "instalador_rua_empresa_terceirizada",
      },
      {
        name: "instalador_numero_empresa_terceirizada",
        text: "Numero da localização da empresa do instalador",
        relacionamento: "instalador_numero_empresa_terceirizada",
      },
      {
        name: "instalador_bairro_empresa_terceirizada",
        text: "Bairro da empresa do instalador",
        relacionamento: "instalador_bairro_empresa_terceirizada",
      },
      {
        name: "instalador_cidade_empresa_terceirizada",
        text: "Cidade da empresa do instalador",
        relacionamento: "instalador_cidade_empresa_terceirizada",
      },
      {
        name: "instalador_estado_empresa_terceirizada",
        text: "Estado da empresa do instalador",
        relacionamento: "instalador_estado_empresa_terceirizada",
      },
      {
        name: "instalador_cep_empresa_terceirizada",
        text: "CEP da empresa do instalador",
        relacionamento: "instalador_cep_empresa_terceirizada",
      },
      {
        name: "forma_pagamento",
        text: "Forma de Pagamento",
        relacionamento: "forma_pagamento",
      },
      {
        name: "conta_bancaria_pagamento",
        text: "Conta da Instituição Financeira",
        relacionamento: "conta_bancaria_pagamento",
      },
      {
        name: "data_primeiro_vencimento_pagamento",
        text: "Data Primeiro Vencimento",
        relacionamento: "data_primeiro_vencimento_pagamento",
      },
      {
        name: "informacoes_pagamento",
        text: "Informações do Pagamento",
        relacionamento: "informacoes_pagamento",
      },

      {
        name: "qtdModulos_pvos",
        text: "Quantidade de Módulos OS",
        relacionamento: "qtdModulos_pvos",
      },
      {
        name: "valorTerceiroAbertura_pvos",
        text: "Custo do Serviço OS",
        relacionamento: "valorTerceiroAbertura_pvos",
      },
      {
        name: "respfin_pvos",
        text: "Responsabilidade Financeira OS",
        relacionamento: "respfin_pvos",
      },
      {
        name: "terceiro_pvos",
        text: "Responsável Financeiramente OS",
        relacionamento: "terceiro_pvos",
      },
      {
        name: "executor_pvos",
        text: "Responsável Instalador OS",
        relacionamento: "executor_pvos",
      },
      {
        name: "telefone_adicional_pvos",
        text: "Telefone Adicional do Cliente OS",
        relacionamento: "telefone_adicional_pvos",
      },
      {
        name: "obs_pvos",
        text: "Observações OS",
        relacionamento: "obs_pvos",
      },
      {
        name: "data_abertura_pvos",
        text: "Data criação OS",
        relacionamento: "data_abertura_pvos",
      },
      {
        name: "data_servico_pvos",
        text: "Data Prevista OS",
        relacionamento: "data_servico_pvos",
      },
      {
        name: "datafinal_servico_pvos",
        text: "Data Final Prevista OS",
        relacionamento: "datafinal_servico_pvos",
      },
      {
        name: "user_gerou_pvos",
        text: "Usuário que Gerou OS",
        relacionamento: "user_gerou_pvos",
      },
    ];
    if (pathname != "/") {
      Promise.all([
        listarRelacionamenosRapidos(),
        listarCamposPersonalizadosRelacionamentos(),
      ]).then(([resRelacionamentos, res]) => {
        resRelacionamentos
          .filter(
            (e: any) =>
              e.status_relacionamento_rapido == 1 &&
              e.mostrarContrato_relacionamento_rapido == 1
          )
          .map((resRelacionamento: any, indexResRelacionamento: number) => {
            novosRelacionamentosOrdensServico.map(
              (relacionamento, indexRelacionamento) => {
                if (
                  relacionamento.name ==
                  resRelacionamento.nome_relacionamento_rapido
                ) {
                  novosRelacionamentosOrdensServico.splice(
                    indexRelacionamento,
                    1,
                    {
                      ...novosRelacionamentosOrdensServico[indexRelacionamento],
                      grupo_relacionamento_rapido:
                        resRelacionamento?.grupo_relacionamento_rapido,
                    }
                  );
                }
              }
            );
          });

        setRelacionamentosOrdemServico((prev: any) => [
          ...novosRelacionamentosOrdensServico,
          ...res.map((campo: any) => ({
            name: campo.nome_relacionamento_rapido,
            text: campo.nome_campo_personalizado,
            relacionamento: campo.nome_relacionamento_rapido,
          })),
        ]);

        setCamposPersonalizadosRelacionamentosOrdensServico((prev: any) => [
          ...res.map((campo: any) => ({
            name: campo.nome_relacionamento_rapido,
            text: campo.nome_campo_personalizado,
            relacionamento: campo.nome_relacionamento_rapido,
            local_campo_personalizado: campo.local_campo_personalizado,
          })),
        ]);

        setCamposRelacionamentosOrdensServico(
          novosRelacionamentosOrdensServico
        );
      });
    }
  };

  useEffect(() => {
    getRelacionamentosRapidosOrdensServico();
  }, []);

  async function relacionarDadosOrdemServico(
    template: Template,
    dadosCliente: any
  ): Promise<Template> {
    return listarRelacionamenosRapidos().then(async (res) => {
      res = res
        .filter(
          (e: any) => e.status_relacionamento_rapido == 1
          // && e.mostrarOS_relacionamento_rapido == 1
        )
        .map((e: any) => e.nome_relacionamento_rapido);
      const camposPersonalizados =
        await listarCamposPersonalizadosRelacionamentos();
      const novosRelacionamentos = [
        ...relacionamentosOrdemServico, // Certifique-se de que essa variável está acessível
        ...camposPersonalizados.map((campo: any) => ({
          name: campo.nome_relacionamento_rapido,
          text: campo.nome_campo_personalizado,
          relacionamento: campo.nome_relacionamento_rapido,
        })),
      ];
      novosRelacionamentos
        // .filter((relacionamento: any) => res.includes(relacionamento.name))
        .map((relacionamento: any) => {
          let dadoRelacional = dadosCliente[relacionamento.relacionamento];
          // dadoRelacional = dadoRelacional
          //   ? dadoRelacional
          //   : dadoRelacional === null || dadoRelacional === ""
          //     ? ""
          //     : relacionamento.relacionamento;
          dadoRelacional = Object.keys(dadosCliente).includes(
            relacionamento.relacionamento
          )
            ? dadosCliente[relacionamento.relacionamento] || ""
            : relacionamento.relacionamento;
          const schemas = template.schemas.map((page) => {
            return page.map((schema) => {
              if (
                schema.type == "image" &&
                relacionamento.name.includes("img") &&
                schema.name === `{${relacionamento.name}}`
              ) {
                schema.content = dadoRelacional;
              } else if (
                schema.type == "table" &&
                relacionamento.name.includes("tabela_kit_val") &&
                schema.name === "{tabela_kit_val}"
              ) {
                const tabelaValues =
                  dadosCliente[relacionamento.relacionamento];

                if (schema.content) {
                  const schemaRows = JSON.parse(schema.content);
                  const orderLabels = schemaRows[0];
                  // orderLabels = ["c", "b", "a"]

                  //   // const numericOrder = orderLables.map((column: string) =>
                  //   //   labelsTable.indexOf(column)
                  //   // );
                  const content: any[] = [];
                  for (let index = 0; index < tabelaValues?.length; index++) {
                    content.push(
                      orderLabels.map((column: string) =>
                        String(tabelaValues[index][column])
                      )
                    );
                  }
                  const linhasForaOrdenacao = schemaRows.filter((row: any) =>
                    row.some(
                      (cell: any) => cell != "" && !orderLabels.includes(cell)
                    )
                  );
                  schema.content = JSON.stringify([
                    ...content,
                    ...linhasForaOrdenacao,
                  ]);
                }
              } else if (
                schema.type == "table" &&
                relacionamento.name.includes("tabela_ucs") &&
                schema.name === "{tabela_ucs}"
              ) {
                const tabelaValues =
                  dadosCliente[relacionamento.relacionamento];

                if (schema.content) {
                  const orderLabels = JSON.parse(schema.content)[0];
                  const content: any[] = [];
                  for (let index = 0; index < tabelaValues?.length; index++) {
                    content.push(
                      orderLabels.map((column: string) =>
                        String(tabelaValues[index][column] || column)
                      )
                    );
                  }
                  schema.content = JSON.stringify(content);
                }
              } else if (
                schema.type == "table" &&
                relacionamento.name.includes("tabela_ubs") &&
                schema.name === "{tabela_ubs}"
              ) {
                const tabelaValues =
                  dadosCliente[relacionamento.relacionamento];

                if (schema.content) {
                  const orderLabels = JSON.parse(schema.content)[0];
                  const content: any[] = [];
                  for (let index = 0; index < tabelaValues?.length; index++) {
                    content.push(
                      orderLabels.map((column: string) =>
                        String(tabelaValues[index][column] || column)
                      )
                    );
                  }
                  schema.content = JSON.stringify(content);
                }
              } else if (
                schema.type == "image" &&
                schema.name.includes("assinatura") &&
                !schema.content &&
                !!dadosCliente?.assinatura
              ) {
                schema.content = dadosCliente?.assinatura;
              } else {
                schema.content = schema.content?.replaceAll(
                  `{${relacionamento.name}}`,
                  dadoRelacional
                );
                if (
                  schema.head &&
                  Object.values(schema.head as any)?.length > 0
                ) {
                  schema.head = (schema.head as string[]).map((head) =>
                    head?.replaceAll(`{${relacionamento.name}}`, dadoRelacional)
                  );
                }
              }
              return schema;
            });
          });
          template = { ...template, schemas };
          // if (relacionamento.name.includes("tabela_kit_val")) {
          //   const tabelaValues = dadosCliente[
          //     relacionamento.relacionamento
          //   ].filter((e: any) => e.name != null);
          //   for (let index = 1; index <= 14; index++) {
          //     const labelsTable = ["name_item", "category_item", "qtd_item"];
          //     for (let i = 1; i <= labelsTable.length; i++) {
          //       if (index <= tabelaValues?.length) {
          //         str = str.replaceAll(
          //           `{tabela_kit_val_${i}.${index}}`,
          //           tabelaValues[index - 1][labelsTable[i - 1]]
          //             ? tabelaValues[index - 1][labelsTable[i - 1]]
          //             : labelsTable[i - 1]
          //         );
          //       } else {
          //         str = str.replaceAll(`{tabela_kit_val_${i}.${index}}`, "");
          //       }
          //     }
          //   }
          // } else {
          //   str = str.replaceAll(`{${relacionamento.name}}`, dadoRelacional);
          // }
        });
      return template;
    });
  }
  function escaparCaracteresDeControle(str: string): string {
    return String(str)
      .replace(/\\/g, "\\\\") // escapa \
      .replace(/\r/g, "\\r") // escapa carriage return
      .replace(/\n/g, "\\n"); // escapa newline
  }

  return (
    <OrdemServicoContext.Provider
      value={{
        getRelacionamentosRapidosOrdensServico,
        relacionamentosOrdemServico,
        camposRelacionamentosOrdensServico,
        camposPersonalizadosRelacionamentosOrdensServico,
        relacionarDadosOrdemServico,
      }}
    >
      {children}
    </OrdemServicoContext.Provider>
  );
};

export const useOrdemServicoContext = () => {
  return useContext(OrdemServicoContext);
};
