import InputSelectComponent from "@/components/Forms/InputSelect";
import { useAuth } from "@/src/contexts/authContext";
import { GetForm } from "@/utils";
import { useState } from "react";
import * as yup from "yup";
import NotificacaoResponsaveisCanalFields from "./NotificacaoResponsaveisCanalFields";

const FormNotificacao = ({
  onSubmitFunction,
  children,
  acoes,
  usuarios,
  notificacoesAutomatizadas,
  ...rest
}: any) => {
  const [yupSchema, setYupSchema] = useState<
    yup.ObjectSchema<{}, yup.AnyObject, {}, "">
  >(yup.object().shape({}));

  const { handleSubmit, ...form } = GetForm(yupSchema, setYupSchema);

  const clearFormToSubmit = (data: any) => {
    data["status_automatizacao_notificacao"] = "1";
    // Só limpa o formulário quando o cadastro passou pelas validações do submit.
    Promise.resolve(onSubmitFunction(data)).then((resultado) => {
      if (resultado !== undefined) {
        form.control._reset();
      }
    });
  };

  const { valuesSession } = useAuth();
  const { session } = valuesSession();

  interface Acao {
    id_acao_notificacao: string;
    nome_acao_notificacao: string;
    configuravel_central_acao_notificacao?: string | number;
  }

  const acoesOrdenadas = acoes
    .filter(
      (acao: Acao) =>
        // Ações configuradas dentro da ETAPA não são configuráveis aqui (item 06).
        acao.configuravel_central_acao_notificacao?.toString() !== "0" &&
        !notificacoesAutomatizadas.some(
          (notificacao: any) =>
            notificacao.acao_automatizacao_notificacao ==
            acao.id_acao_notificacao
        )
    )
    .map((acao: Acao) => ({
      value: acao.id_acao_notificacao,
      label: acao.nome_acao_notificacao,
    }));

  return (
    <form
      onSubmit={handleSubmit(clearFormToSubmit)}
      {...rest}
      className="flex flex-col gap-4"
    >
      <NotificacaoResponsaveisCanalFields
        form={form}
        usuarios={usuarios}
        idUsuarioLogado={session.id_usuario}
        campoAcao={
          <InputSelectComponent
            name="acao_automatizacao_notificacao"
            label="Ação a Ser Notificada"
            formulario={form}
            options={acoesOrdenadas}
            error="Selecione uma ação"
            required
            width="w-full"
          />
        }
      />

      {children}
    </form>
  );
};

export default FormNotificacao;
