import LoaderSun from "@/components/common/Loader/LoaderSun";
import ReactTable from "@/components/ReactTable/ReactTable";
import Input from "@/components/Forms/Input";
import InputGroup from "@/components/Forms/InputGroup";
import InputSelectComponent from "@/components/Forms/InputSelect";
import { handleSweetAlert } from "@/components/Modal/SweetAlertConfirm";
import { listarInversores } from "@/requests/CRUD/Inversor/listarInversores";
import { listarModulos } from "@/requests/CRUD/Modulos/listarModulos";
import { listagemItens } from "@/requests/CRUD/KitManual/listarKitManual";
import { listarDistribuidores } from "@/requests/CRUD/Distribuidores/listarDistribuidores";
import { listarDistribuidoresNativos } from "@/requests/CRUD/Distribuidores/listarDistribuidoresNativos";
import { listarLojas } from "@/requests/CRUD/Lojas/listarLojas";
import { listarTiposTelhados } from "@/requests/CRUD/TiposTelhados/listarTiposTelhados";
import { listarParametros } from "@/requests/CRUD/ParametrosComerciais/listarParametros";
import {
  cadastrarTabelaPreco,
  deletarTabelaPreco,
  editarTabelaPreco,
  exportarTabelaPrecoExcel,
  listarTabelasPrecos,
} from "@/requests/CRUD/TabelaPreco/tabelaPreco";
import { useAuth } from "@/src/contexts/authContext";
import { baixarArquivoBase64, FormatFields, GetForm } from "@/utils";
import { Eye, EyeOff, FileSpreadsheet, Trash } from "lucide-react";
import { useEffect, useState } from "react";
import { MdEdit, MdOutlineToggleOff, MdOutlineToggleOn } from "react-icons/md";
import Swal from "sweetalert2";
import FormTabelaPreco from "./FormTabelaPreco";

const ConsultaTabelaPreco = () => {
  const [dados, setDados] = useState<any[]>([]);
  const [dadosFiltrados, setDadosFiltrados] = useState<any[]>([]);
  const [filtro, setFiltro] = useState<any>({});
  const [isLoaded, setIsLoaded] = useState(false);
  const [lojas, setLojas] = useState<any[]>([]);
  const [distribuidores, setDistribuidores] = useState<any[]>([]);
  const [distribuidoresNativos, setDistribuidoresNativos] = useState<any[]>([]);
  const [tiposTelhados, setTiposTelhados] = useState<any[]>([]);
  const [inversores, setInversores] = useState<any[]>([]);
  const [modulos, setModulos] = useState<any[]>([]);
  const [estruturas, setEstruturas] = useState<any[]>([]);
  const [parametros, setParametros] = useState<any>({});
  const formFiltro = GetForm();
  const { valuesSession } = useAuth();
  const { session } = valuesSession();

  const isMostrarAutAtivo = (valor: any) =>
    String(valor) === "1" || valor === "Sim";

  const columns = [
    { header: "ID", accessorKey: "id_tabela_preco" },
    { header: "ID Item", accessorKey: "id_item_kit_tabela_preco" },
    { header: "Código", accessorKey: "cod_tabela_preco" },
    { header: "Descrição", accessorKey: "descricao_tabela_preco" },
    { header: "Loja", accessorKey: "loja_label" },
    { header: "Distribuidor", accessorKey: "distribuidor_label" },
    { header: "Módulo", accessorKey: "modulo_tabela_preco" },
    { header: "Estruturas", accessorKey: "estruturas_tabela_preco" },
    { header: "Linhas", accessorKey: "qtd_linhas" },
    { header: "Status", accessorKey: "status_label" },
    { header: "Mostrar Aut.", accessorKey: "mostrarAut_label" },
  ];

  const listar = async () => {
    const res = await listarTabelasPrecos();
    setDados(res || []);
  };

  useEffect(() => {
    Promise.all([
      listar(),
      listarLojas(session.id_usuario).then(setLojas),
      listarTiposTelhados().then(setTiposTelhados),
      listarInversores().then(setInversores),
      listarModulos().then(setModulos),
      listagemItens("estruturas", { tipoOrigem_item: "*" }).then(setEstruturas),
      listarParametros().then(setParametros),
      listarDistribuidores().then((res) =>
        setDistribuidores(
          res.filter((d: any) => d.isFornecedor_distribuidor == "0")
        )
      ),
      listarDistribuidoresNativos().then(setDistribuidoresNativos),
    ]).then(() => setIsLoaded(true));
  }, []);

  const formatFunction = (arr: any[]) =>
    arr.map((raw) => {
      const item = { ...raw };
      item.qtd_linhas = item.linhas?.length || 0;
      item.loja_label =
        item.loja_tabela_preco === "*"
          ? "Todas"
          : lojas.find((l) => String(l.id_loja) === String(item.loja_tabela_preco))
              ?.nome_loja || item.loja_tabela_preco;
      const distribuidorNativo =
        String(item.distribuidorNativo_tabela_preco) === "1";
      item.distribuidor_label =
        item.codDistribuidor_tabela_preco === "*"
          ? "Todos"
          : (distribuidorNativo ? distribuidoresNativos : distribuidores).find(
              (d) =>
                String(d.id_distribuidor) ===
                String(item.codDistribuidor_tabela_preco)
            )?.nome_distribuidor || item.codDistribuidor_tabela_preco;
      const estruturasDaTabela = String(item.idsEstrutura_tabela_preco || "")
        .split(",")
        .map((id) => id.trim())
        .filter(Boolean)
        .map((id) => estruturas.find((e) => String(e.id_item) === String(id)))
        .filter(Boolean);
      item.estruturas_tabela_preco =
        estruturasDaTabela
          .map((e: any) => e.descricao_item)
          .join(", ") || "-";
      item.modulo_tabela_preco =
        modulos.find(
          (m) => String(m.id_item) === String(item.idModulo_tabela_preco)
        )?.descricao_item || "-";
      item.status_label =
        String(item.status_tabela_preco) === "1" ? "Ativo" : "Inativo";
      item.mostrarAut_label =
        String(item.mostrarAut_tabela_preco) === "1" ? "Sim" : "Não";
      return item;
    });

  useEffect(() => {
    const filtered = dados.filter((item) =>
      Object.entries(filtro).every(([chave, valorFiltro]: [string, any]) => {
        if (
          valorFiltro === undefined ||
          valorFiltro === null ||
          (Array.isArray(valorFiltro) && valorFiltro.length === 0)
        ) {
          return true;
        }
        if (Array.isArray(valorFiltro)) {
          if (valorFiltro.includes("*")) return true;
          return valorFiltro.includes(String(item[chave]));
        }
        return String(item[chave]) === String(valorFiltro);
      })
    );
    setDadosFiltrados(filtered);
  }, [filtro, dados]);

  const fakeList = async () => {
    const res = await listarTabelasPrecos();
    setDados(res || []);
    return res || [];
  };

  const handleDelete = (row: any) => {
    Swal.fire({
      title: "Excluir tabela de preço",
      text: "Deseja excluir a tabela selecionada?",
      icon: "warning",
      showCancelButton: true,
      confirmButtonText: "Sim",
    }).then((result) => {
      if (result.isConfirmed) {
        deletarTabelaPreco({ id_tabela_preco: row.id_tabela_preco }).then(listar);
      }
    });
  };

  if (!isLoaded) {
    return (
      <div className="flex justify-center w-full">
        <LoaderSun />
      </div>
    );
  }

  return (
    <>
      <InputGroup>
        <InputSelectComponent
          name="status_tabela_preco"
          label="Status"
          formulario={formFiltro}
          isMulti
          options={[
            { value: "*", label: "Todos" },
            { value: "1", label: "Ativo" },
            { value: "0", label: "Inativo" },
          ]}
          onChange={(e: any) =>
            setFiltro((prev: any) => ({
              ...prev,
              status_tabela_preco: e.map((a: any) => a.value),
            }))
          }
        />
        <InputSelectComponent
          name="mostrarAut_tabela_preco"
          label="Mostrar Automaticamente nos Componentes"
          formulario={formFiltro}
          isMulti
          options={[
            { value: "*", label: "Todos" },
            { value: "1", label: "Sim" },
            { value: "0", label: "Não" },
          ]}
          onChange={(e: any) =>
            setFiltro((prev: any) => ({
              ...prev,
              mostrarAut_tabela_preco: e.map((a: any) => a.value),
            }))
          }
        />
        <Input
          name="cod_tabela_preco"
          label="Código"
          formulario={formFiltro}
          onChange={(e: any) =>
            setFiltro((prev: any) => ({
              ...prev,
              cod_tabela_preco: e.target.value,
            }))
          }
        />
      </InputGroup>

      <ReactTable
        columns={columns}
        data={dadosFiltrados}
        listFunction={fakeList}
        idCol="id_tabela_preco"
        isActiveCol="status_tabela_preco"
        manualFilters
        createFunction={cadastrarTabelaPreco}
        editFunction={editarTabelaPreco}
        formatFunction={formatFunction}
        pageName="Tabela de Preço"
        Form={(props) => (
          <FormTabelaPreco
            {...props}
            lojas={lojas}
            distribuidores={distribuidores}
            distribuidoresNativos={distribuidoresNativos}
            tiposTelhados={tiposTelhados}
            inversores={inversores}
            modulos={modulos}
            estruturas={estruturas}
            parametros={parametros}
          />
        )}
        actionButtons={(
          rowData,
          updateTable,
          _setIsLoading,
          { idCol, isActive, isActiveCol, pageName, editFunction, rowOriginal, openEdit }
        ) => {
          const visivelComponentes = isMostrarAutAtivo(
            rowOriginal.mostrarAut_tabela_preco
          );

          return [
          {
            title: "Editar",
            className: "navButton buttonWarning",
            onClick: () => openEdit(rowOriginal),
            content: <MdEdit />,
          },
          {
            className: `navButton ${isActive ? "buttonSuccess" : "buttonDanger"}`,
            onClick: () =>
              handleSweetAlert(
                {
                  icon: "warning",
                  title: `${!isActive ? "Ativar" : "Desativar"} ${pageName}`,
                  html: `Deseja <b>${!isActive ? "ativar" : "desativar"}</b> o registro ${rowData[idCol]}?`,
                },
                () =>
                  editFunction({
                    ...rowOriginal,
                    mudar_status: 1,
                    [isActiveCol]: !isActive ? "1" : "0",
                    status_tabela_preco: !isActive ? "1" : "0",
                  }).then(() => {
                    listar();
                    updateTable();
                  })
              ),
            content: isActive ? <MdOutlineToggleOn /> : <MdOutlineToggleOff />,
          },
          {
            className: `navButton ${visivelComponentes ? "buttonSuccess" : "buttonDanger"}`,
            title: "Mostrar Automaticamente nos Componentes",
            onClick: () =>
              handleSweetAlert(
                {
                  icon: "warning",
                  title: "Alterar visibilidade nos componentes",
                  html: `Deseja ${visivelComponentes ? "ocultar" : "mostrar"} automaticamente o registro ${rowData[idCol]} nos componentes?`,
                },
                () =>
                  editFunction({
                    ...rowOriginal,
                    mudar_visibilidade: 1,
                    mostrarAut_tabela_preco: visivelComponentes ? "0" : "1",
                  }).then(() => {
                    listar();
                    updateTable();
                  })
              ),
            content: visivelComponentes ? <Eye /> : <EyeOff />,
          },
          {
            className: "navButton buttonExcel",
            title: "Exportar Excel (com Custo do Kit)",
            onClick: () =>
              exportarTabelaPrecoExcel(rowOriginal.id_tabela_preco, false).then(
                baixarArquivoBase64
              ),
            content: <FileSpreadsheet size={18} strokeWidth={2.25} />,
          },
          {
            className: "navButton buttonDanger",
            title: "Deletar",
            onClick: () => handleDelete(rowOriginal),
            content: <Trash />,
          },
        ];
        }}
      />
    </>
  );
};

export default ConsultaTabelaPreco;
