import { listarContratosAprovados } from "@/requests/CRM/Contrato/listarContratosAprovados";
import GraficoDinamico from "../GraficoGeraDinamico";


function agruparPorPeriodo(contratos: any[], periodo: any) {
  if (!contratos || contratos.length === 0) return [];

  // Normaliza contratos
  contratos = contratos.map((c: any) => ({
    ...c,
    dataFinalizacaoVenda_coleta: new Date(c.dataFinalizacaoVenda_coleta).getTime(),
    valorTotal_proposta: Number(c.valorTotal_proposta),
  }));

  let filteredContratos = contratos;
  if (periodo !== "*") {
    periodo = JSON.parse(periodo);
  }
  if (periodo !== "*") {
    const start = new Date(periodo.from);
    const end = new Date(periodo.to);
    start.setHours(0, 0, 0, 0);
    end.setHours(23, 59, 59, 999);

    filteredContratos = contratos.filter((c) => {
      const dt = new Date(c.dataFinalizacaoVenda_coleta);
      return dt >= start && dt <= end;
    });
  }

  if (filteredContratos.length === 0) return [];

  // Decide se agrupa por dia ou por mês
  let arr: any[] = [];
  if (periodo === "*" || (periodo.from && periodo.to)) {
    const startDate =
      periodo === "*"
        ? new Date(
          Math.min(...filteredContratos.map((c) => c.dataFinalizacaoVenda_coleta)),
        )
        : new Date(periodo.from);
    const endDate =
      periodo === "*"
        ? new Date(
          Math.max(...filteredContratos.map((c) => c.dataFinalizacaoVenda_coleta)),
        )
        : new Date(periodo.to);

    startDate.setHours(0, 0, 0, 0);
    endDate.setHours(23, 59, 59, 999);

    const diffDays = Math.ceil(
      (endDate.getTime() - startDate.getTime()) / (1000 * 60 * 60 * 24),
    );

    if (diffDays <= 60) {
      // Agrupa por dia
      const loop = new Date(startDate);
      while (loop <= endDate) {
        const dayKey = loop.toISOString().slice(0, 10); // yyyy-mm-dd

        const items = filteredContratos.filter((e) => {
          const dt = new Date(e.dataFinalizacaoVenda_coleta);
          return (
            dt.getDate() === loop.getDate() &&
            dt.getMonth() === loop.getMonth() &&
            dt.getFullYear() === loop.getFullYear()
          );
        });

        const valor = items.reduce(
          (acc, curr) => acc + curr.valorTotal_proposta,
          0,
        );

        arr.push({
          periodo: dayKey,
          quantidade_propostas: items.length,
          soma_valores_propostas_mil: Number(valor.toFixed(2)) || 0,
        });

        loop.setDate(loop.getDate() + 1);
      }
    } else {
      // Agrupa por mês
      const loop = new Date(startDate.getFullYear(), startDate.getMonth(), 1);
      while (loop <= endDate) {
        const monthKey = `${loop.getFullYear()}-${("0" + (loop.getMonth() + 1)).slice(-2)}`;

        const items = filteredContratos.filter((e) => {
          const dt = new Date(e.dataFinalizacaoVenda_coleta);
          return (
            dt.getMonth() === loop.getMonth() &&
            dt.getFullYear() === loop.getFullYear()
          );
        });

        const valor = items.reduce(
          (acc, curr) => acc + curr.valorTotal_proposta,
          0,
        );

        arr.push({
          periodo: monthKey,
          quantidade_propostas: items.length,
          soma_valores_propostas_mil: Number((valor / 1000).toFixed(2)) || 0,
        });

        loop.setMonth(loop.getMonth() + 1);
      }
    }
  }

  return arr;
}

const GraficoVendas = (props: any) => {
  return (
    <GraficoDinamico
      nomeGrafico={props.label}
      buscar={async ({ usuario, periodoSelecionado, lojas, tipoNegocio, classificacaoNegocio }) => {
        const contratos =
          (await listarContratosAprovados(
            { vendedor: usuario },
            lojas,
            tipoNegocio,
            classificacaoNegocio,
          )) || [];
        return agruparPorPeriodo(contratos, periodoSelecionado);
      }}
      usuarios={props.usuarios}
      lojas={props.lojas}
      tipoNegocio={props.tipoNegocio}
      classificacaoNegocio={props.classificacaoNegocio}
      periodoSelecionado={props.periodoSelecionado}
      chaveLabel="periodo"
      chavesSeries={[
        { nome: "Quantidade", campo: "quantidade_propostas" },
        { nome: "Valor (mil)", campo: "soma_valores_propostas_mil" },
      ]}
      tiposGrafico={["Barra", "Linha"]}
    />
  );
};

export default GraficoVendas;