import { handleSweetAlert } from "@/components/Modal/SweetAlertConfirm";
import ReactTable from "@/components/ReactTable/ReactTable";
import { cadastrarPerfil } from "@/requests/CRUD/Perfil/cadastrarPerfil";
import { editarPerfil } from "@/requests/CRUD/Perfil/editarPerfil";
import { listarTodosCargos } from "@/requests/CRUD/Perfil/listarPerfil";
import { listarPerfis } from "@/requests/CRUD/Perfil/listarPerfis";
import { useAuth } from "@/src/contexts/authContext";
import _ from "lodash";
import { MdOutlineToggleOff, MdOutlineToggleOn } from "react-icons/md";
import { toast } from "react-toastify";
import FormEditPerfil from "./FormEditPerfil";

const PerfilComponent = () => {
  const dados = [
    "status_perfil",
    "nome_perfil",
    "id_perfil",
    "cargo_perfil",
    "visualiza_todos_contatos_perfil",
    "visualiza_todas_agendas_perfil",
  ];

  const { valuesSession, usuario, obterDadosUsuario } = useAuth();

  const { session } = valuesSession();
  const perfilUsuario = session.perfil_usuario;
  const columns = [
    ...dados.map((e) => ({
      header: _.capitalize(e).replaceAll("_perfil", "").replaceAll("_", " "),
      accessorKey: e,
    })),
  ];

  const formatSimouNao = async (arr: any) => {
    const todosCargos = await listarTodosCargos();

    if (perfilUsuario == "1000") {
      return arr.map((perfil: any) => {
        perfil["visualiza_todos_contatos_perfil"] =
          +perfil["visualiza_todos_contatos_perfil"] === 1 ? "Sim" : "Não";
        perfil["visualiza_todas_agendas_perfil"] =
          +perfil["visualiza_todas_agendas_perfil"] === 1 ? "Sim" : "Não";
        perfil["cargo_perfil"] = todosCargos.find(
          (cargo: any) => cargo.id_cargo == perfil["cargo_perfil"],
        )?.nome_cargo;
        return perfil;
      });
    } else {
      return arr
        .filter((perfil: any) => perfil.id_perfil != "1000")
        .map((perfil: any) => {
          perfil["visualiza_todos_contatos_perfil"] =
            +perfil["visualiza_todos_contatos_perfil"] === 1 ? "Sim" : "Não";
          perfil["visualiza_todas_agendas_perfil"] =
            +perfil["visualiza_todas_agendas_perfil"] === 1 ? "Sim" : "Não";
          perfil["cargo_perfil"] = todosCargos.find(
            (cargo: any) => cargo.id_cargo == perfil["cargo_perfil"],
          )?.nome_cargo;
          return perfil;
        });
    }
  };
  function splitFunc(key: string) {
    return key.split("^");
  }
  const editarPerfis = async (data: any) => {
    const todosPerfis = await listarPerfis();
    const permitidas = new Set(["11", "14"]);

    const permissoes = splitFunc(data.permissoes_menu_cfg_perfil)
      .map((s: any) => String(s).trim())
      .filter(Boolean);

    const temUserEPerf = permissoes.some((s) => permitidas.has(s));

    if (data.cargo_perfil === "-1" && !temUserEPerf) {
      const perfisCompativeis = todosPerfis.filter(
        (p: any) =>
          p.cargo_perfil === "-1" &&
          splitFunc(p.permissoes_menu_cfg_perfil).some((s: string) =>
            ["11", "14"].includes(s),
          ),
      );

      if (perfisCompativeis.length == 1) {
        return toast.error(
          "Ao menos 1 perfil de administrador precisa ter acesso aos menus de Usuários e Perfis de Usuários!",
        );
      }
    }

    delete data["permite_reabrir_projeto_concluído"];
    return editarPerfil(data).then(async (resPerfil) => {
      if (usuario?.id_usuario) {
        await obterDadosUsuario(usuario?.id_usuario);
      }
      return resPerfil;
    });
  };

  return (
    <>
      <h2 className="text-xl font-bold mb-4">Perfis de Usuário</h2>
      <ReactTable
        columns={columns}
        listFunction={async (p) =>
          listarPerfis({ ...p, id_usuario: usuario?.id_usuario })
        }
        formatFunction={formatSimouNao}
        idCol="id_perfil"
        isActiveCol="status_perfil"
        canEdit
        // canDesactive
        actionButtons={(
          rowData: any,
          updateTable: any,
          setIsLoading: any,
          { idCol, isActive, isActiveCol, pageName, editFunction, listData },
        ) => {
          // Filtra os perfis de administrador que estão ativos
          const perfisAdminAtivos = listData.filter(
            (perfil: any) =>
              perfil["cargo_perfil"] == "-1" && perfil["status_perfil"] == "1",
          );

          const ocultarToggle =
            perfisAdminAtivos.length == 1 &&
            rowData["cargo_perfil"].trim() == "Adm-Sistema";

          return [
            {
              className: `navButton ${isActive ? "buttonSuccess" : "buttonDanger"}`,

              onClick: (e: any) => {
                handleSweetAlert(
                  {
                    icon: "warning",
                    title: `${!isActive ? "Ativar" : "Desativar"} ${pageName}`,
                    html: `Tem certeza que deseja <b>${!isActive ? "Ativar" : "Desativar"}</b> o registro ${rowData[idCol]}?`,
                  },
                  async () => {
                    return editFunction({
                      [idCol]: rowData[idCol],
                      [isActiveCol]: !isActive,
                    }).then(() => updateTable());
                  },
                );
              },
              content:
                // Se houver apenas 1 perfil admin ativo e este perfil for o da linha atual, não mostra o botão de desativar
                ocultarToggle ? undefined : isActive ? (
                  <MdOutlineToggleOn />
                ) : (
                  <MdOutlineToggleOff />
                ),
            },
          ];
        }}
        createFunction={cadastrarPerfil}
        editFunction={editarPerfis}
        Form={FormEditPerfil}
        pageName="Perfil"
      />
    </>
  );
};

export default PerfilComponent;
