import Container from "@/components/Forms/Container";
import InputGroup from "@/components/Forms/InputGroup";
import InputSelectComponent from "@/components/Forms/InputSelect";
import ReactTable from "@/components/ReactTable/ReactTable";
import { handleSweetAlert } from "@/components/Modal/SweetAlertConfirm";
import {
  descreverTipos,
  opcoesTipoNotificacao,
  paraCsvDeCanais,
  paraListaDeTipos,
  textoSimplesDoModelo,
} from "@/constants/modeloNotificacao";
import {
  Desc_TipoNotificacaoCanal,
  TipoNotificacaoCanal,
} from "@/enums/enums";
import { cadastrarModeloEmail } from "@/requests/CRUD/ModelosEmail/cadastrarModeloEmail";
import { editarModeloEmail } from "@/requests/CRUD/ModelosEmail/editarModeloEmail";
import { listarModeloEmail } from "@/requests/CRUD/ModelosEmail/listarModeloEmail";
import { GetForm } from "@/utils";
import { filtrarPorTexto } from "@/utils/filters";
import { useState } from "react";
import { FieldValues } from "react-hook-form";
import FormModeloEmail from "./FormModeloEmail";


const filtrarPorTipoDeNotificacao = (
  row: any,
  _columnId: string,
  filterValue: any
) => {
  if (!filterValue || ["Todos", "Todas", "*", ""].includes(filterValue)) {
    return true;
  }

  return (row.original.tipos_notificacao_labels ?? []).includes(
    String(filterValue)
  );
};

const NotificacaoModeloEmail = () => {
  const [filtro, setFiltro] = useState<any>({});
  const formFiltro = GetForm();

  const columns = [
    {
      header: "Código",
      accessorKey: "id",
    },
    {
      header: "Status",
      accessorKey: "status",
      filterFn: filtrarPorTexto,
    },
    {
      header: "Nome",
      accessorKey: "nome",
    },
    {
      header: "Tipo de Notificação",
      accessorKey: "tipo_notificacao",
      filterFn: filtrarPorTipoDeNotificacao,
    },
    {
      header: "Assunto",
      accessorKey: "assunto",
    },
    {
      header: "Titulo",
      accessorKey: "titulo",
    },
    // Item 02: a Mensagem vem logo depois do Título.
    {
      header: "Mensagem",
      accessorKey: "mensagem",
    },
  ];


  const formatFunction = (linhas: any[]) =>
    linhas.map((linha) => {
      const tipos = paraListaDeTipos(linha.tipo_notificacao);

      return {
        ...linha,
        nome: linha.nome || linha.titulo,
        // Item 01: Central de Notificações e WhatsApp não têm Assunto.
        assunto: tipos.includes(TipoNotificacaoCanal.Email)
          ? linha.assunto
          : "",
        mensagem: textoSimplesDoModelo(linha.corpo_email),
        tipo_notificacao: descreverTipos(linha.tipo_notificacao),
        tipos_notificacao_labels: tipos.map(
          (tipo) => (Desc_TipoNotificacaoCanal as any)[tipo] || tipo
        ),
      };
    });

  // A linha do grid volta inteira no submit: as colunas montadas só para
  // exibição são descartadas porque o back-end grava o payload campo a campo.
  // Habilitar/Desabilitar envia apenas o id e o status — nesse caso o tipo e o
  // assunto não vêm no payload e ficam como estão no banco.
  const normalizarPayload = (data: FieldValues) => {
    const { mensagem, tipos_notificacao_labels, ...payload } = data;

    if (payload["tipo_notificacao"] === undefined) return payload;

    const tipoNotificacao =
      paraCsvDeCanais(payload["tipo_notificacao"]) || TipoNotificacaoCanal.Email;

    const ehEmail = paraListaDeTipos(tipoNotificacao).includes(
      TipoNotificacaoCanal.Email
    );

    return {
      ...payload,
      tipo_notificacao: tipoNotificacao,
      // Item 01: sem canal de E-mail o Assunto não existe e não pode sobrar do
      // que estava gravado antes da troca de tipo.
      assunto: ehEmail ? payload["assunto"] ?? "" : "",
    };
  };


  const validarPayload = (payload: FieldValues) => {
    if (payload.tipo_notificacao === undefined) return true;

    if (
      paraListaDeTipos(payload.tipo_notificacao).includes(
        TipoNotificacaoCanal.Email
      ) &&
      !String(payload.assunto ?? "").trim()
    ) {
      handleSweetAlert({
        icon: "warning",
        title: "Preencha o Assunto",
        html: "Modelos de Notificação por E-mail exigem o Assunto.",
        showDenyButton: false,
        confirmButtonText: "Ok",
      });
      return false;
    }
    return true;
  };

  const onSubmitFunction = async (data: FieldValues) => {
    const payload = normalizarPayload(data);
    if (!validarPayload(payload)) return;
    return cadastrarModeloEmail(payload);
  };

  const editFunction = async (data: FieldValues) => {
    const payload = normalizarPayload(data);
    if (!validarPayload(payload)) return;
    return editarModeloEmail(payload);
  };

  return (
    <>
      <h2 className="text-xl font-bold mb-2">Modelo de Notificação</h2>
      <Container>
        <InputGroup>
          <InputSelectComponent
            name="tipo_notificacao"
            label="Tipo de Notificação"
            formulario={formFiltro}
            options={[{ label: "Todos", value: "*" }, ...opcoesTipoNotificacao]}
            onChange={(e: any) =>
              setFiltro((prev: any) => ({
                ...prev,
                tipo_notificacao: e?.label,
              }))
            }
          />
          <InputSelectComponent
            name="status"
            label="Status"
            formulario={formFiltro}
            options={[
              { label: "Todos", value: "*" },
              { label: "Ativo", value: "1" },
              { label: "Inativo", value: "0" },
            ]}
            onChange={(e: any) =>
              setFiltro((prev: any) => ({
                ...prev,
                status: e?.label,
              }))
            }
          />
        </InputGroup>
        <ReactTable
          columns={columns}
          listFunction={listarModeloEmail}
          formatFunction={formatFunction}
          idCol="id"
          isActiveCol="status"
          canEdit
          canDesactive
          editFunction={editFunction}
          createFunction={onSubmitFunction}
          Form={FormModeloEmail}
          pageName="Modelo de Notificação"
          filters={filtro}
          manualFilters
        />
      </Container>
    </>
  );
};

export default NotificacaoModeloEmail;
