"use client";

import Breadcrumb from "@/components/Breadcrumbs/Breadcrumb";
import Container from "@/components/Forms/Container";
import Input from "@/components/Forms/Input";
import InputGroup from "@/components/Forms/InputGroup";
import ReactTable from "@/components/ReactTable/ReactTable";
import { Button } from "@/components/ui/button";
import { STATUS_META } from "@/pages/CXESCRM008";
import {
  finalizarMeta,
  listarMetasParaFinalizar,
} from "@/requests/CRM/Metas/finalizarMetas";
import { useAuth } from "@/src/contexts/authContext";
import { useState } from "react";
import { MdOutlineAssignmentTurnedIn } from "react-icons/md";
import { toast } from "react-toastify";
import Swal from "sweetalert2";

const periodo = [
  { label: "Semanal", value: "1" },
  { label: "Quinzenal", value: "2" },
  { label: "Mensal", value: "3" },
  { label: "Trimestral", value: "4" },
  { label: "Semestral", value: "5" },
  { label: "Anual", value: "6" },
];

const formatarDataBrasileira = (data: string): string => {
  if (!data) return "";
  const [ano, mes, dia] = String(data).split("-");
  return `${dia}/${mes}/${ano}`;
};

const FinalizarMetasEmAndamento = () => {
  const [dataInicio, setDataInicio] = useState<string>("");
  const [dataFim, setDataFim] = useState<string>("");
  const [metas, setMetas] = useState<any[]>([]);
  const [isLoading, setIsLoading] = useState(false);
  const [buscou, setBuscou] = useState(false);
  const { valuesSession } = useAuth();
  const { session } = valuesSession();

  const buscarMetas = async () => {
    if (!dataInicio || !dataFim) {
      toast.error("Informe o início e o fim do período a ser finalizado!");
      return null;
    }
    if (dataFim < dataInicio) {
      toast.error("O fim do período deve ser maior que o início!");
      return null;
    }

    setIsLoading(true);
    try {
      const res = await listarMetasParaFinalizar({
        dataInicio_periodo: dataInicio,
        dataFim_periodo: dataFim,
      });
      const pendentes = res ?? [];
      setMetas(pendentes);
      setBuscou(true);
      return pendentes;
    } finally {
      setIsLoading(false);
    }
  };

  const finalizar = async (meta: any) => {
    const res: any = await finalizarMeta({
      id_meta_politica: meta.id_meta_politica,
      id_usuario: session.id_usuario,
    });
    if (res?.message) toast.success(res.message);
  };

  // Pergunta meta a meta (um SweetAlert por vez) e grava o fechamento das confirmadas
  const perguntarFinalizacoes = async (pendentes: any[]) => {
    if (!pendentes || pendentes.length === 0) {
      Swal.fire({
        title: "Nenhuma meta encontrada",
        text: "Não há metas Em Andamento com fim do prazo dentro do período informado.",
        icon: "info",
        confirmButtonColor: "#3085d6",
      });
      return;
    }

    let finalizou = false;
    for (const meta of pendentes) {
      const result = await Swal.fire({
        title: "Finalizar Meta?",
        html: `A meta <b>${meta.id_meta_politica}-${meta.nome_meta_politica}</b> chegou ao fim do prazo.<br/>Deseja finalizá-la e gravar o resultado?`,
        icon: "question",
        showCancelButton: true,
        confirmButtonText: "Finalizar",
        confirmButtonColor: "#429e12",
        cancelButtonText: "Depois",
        cancelButtonColor: "#3085d6",
      });

      if (result.isConfirmed) {
        setIsLoading(true);
        try {
          await finalizar(meta);
          finalizou = true;
        } finally {
          setIsLoading(false);
        }
      }
    }

    if (finalizou) await buscarMetas();
  };

  const handleBuscar = async () => {
    // Apenas consulta as metas Em Andamento; a finalização é solicitada
    // por meta, ao clicar no botão "Finalizar meta" do GRID.
    await buscarMetas();
  };

  const formatFunction = (data: any) => {
    return data.map((item: any) => {
      const status = String(item.status_meta_politica);
      const statusInfo = STATUS_META[status] ?? STATUS_META["2"];

      item["status_raw"] = status;
      item["status_meta_politica"] = statusInfo.label;

      item["periodo_meta_politica"] =
        periodo.find((a: any) => a.value === String(item["periodo_meta_politica"]))
          ?.label || item["periodo_meta_politica"];

      const realizado = item["realizado_meta_politica"];
      const percentual = item["percentual_meta_politica"];
      item["realizado_fmt"] =
        realizado === null || realizado === undefined
          ? "-"
          : Number(realizado).toLocaleString("pt-BR");
      item["percentual_fmt"] =
        percentual === null || percentual === undefined
          ? "-"
          : `${Number(percentual).toLocaleString("pt-BR", {
              maximumFractionDigits: 1,
            })}%`;

      item["dataInicial_meta_politica"] = formatarDataBrasileira(
        item["dataInicial_meta_politica"],
      );
      item["dataFinal_meta_politica"] = formatarDataBrasileira(
        item["dataFinal_meta_politica"],
      );

      return item;
    });
  };

  const columns = [
    {
      header: "ID",
      accessorKey: "id_meta_politica",
    },
    {
      header: "Status",
      accessorKey: "status_meta_politica",
      cell: ({ row }: any) => {
        const statusInfo =
          STATUS_META[String(row.original.status_raw)] ?? STATUS_META["2"];
        return (
          <span
            className={`justify-center text-center ${statusInfo.className} border flex items-center px-2 py-0.5 font-semibold text-sm rounded-full`}
          >
            {statusInfo.label}
          </span>
        );
      },
    },
    {
      header: "Nome",
      accessorKey: "nome_meta_politica",
    },
    {
      header: "Objetivo",
      accessorKey: "nome_objetivo_meta",
    },
    {
      header: "Periodo",
      accessorKey: "periodo_meta_politica",
    },
    {
      header: "Início Meta",
      accessorKey: "dataInicial_meta_politica",
    },
    {
      header: "Fim Meta",
      accessorKey: "dataFinal_meta_politica",
    },
    {
      header: "Valor Objetivo da Meta",
      accessorKey: "valorObjetivo_meta_politica",
    },
    {
      header: "Realizado",
      accessorKey: "realizado_fmt",
    },
    {
      header: "% Atingido",
      accessorKey: "percentual_fmt",
      cell: ({ row, getValue }: any) => {
        const percentual = row.original.percentual_meta_politica;
        if (percentual === null || percentual === undefined) return "-";
        const cor =
          Number(percentual) >= 100
            ? "text-[#429e12]"
            : Number(percentual) >=
                Number(row.original.limiteAceitavel_meta_politica || 0)
              ? "text-[#266c94]"
              : "text-[#ff0a0a]";
        return (
          <span className={`font-semibold ${cor}`}>{String(getValue())}</span>
        );
      },
    },
  ];

  return (
    <>
      <Breadcrumb pageName="Finalizar Metas Em Andamento" />
      <Container>
        <InputGroup>
          <Input
            type="date"
            label="Início do Período"
            value={dataInicio}
            onChange={(e: any) => setDataInicio(e.target.value)}
          />
          <Input
            type="date"
            label="Fim do Período"
            value={dataFim}
            onChange={(e: any) => setDataFim(e.target.value)}
          />
        </InputGroup>
        <InputGroup align="center">
          <Button
            className="px-9 text-sm bg-success hover:bg-success hover:bg-opacity-90"
            disabled={isLoading}
            onClick={handleBuscar}
          >
            Buscar Metas Em Andamento
          </Button>
        </InputGroup>

        {buscou && (
          <ReactTable
            pageName={"Finalizar Metas Em Andamento"}
            columns={columns}
            formatFunction={formatFunction}
            data={metas}
            idCol="id_meta_politica"
            actionButtons={(data: any) => [
              {
                className: `navButton bg-success text-white`,
                title: "Finalizar meta",
                onClick: async () => {
                  await perguntarFinalizacoes([
                    metas.find(
                      (m: any) => m.id_meta_politica === data.id_meta_politica,
                    ) ?? data,
                  ]);
                },
                content: <MdOutlineAssignmentTurnedIn />,
              },
            ]}
          />
        )}
      </Container>
    </>
  );
};

export default FinalizarMetasEmAndamento;
