import React, { FC, useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { IWebhook, IExtendedWebhook } from "types";
import { GenerateKey } from "./generate-key";
import { observer } from "mobx-react-lite";
// components
import { DeleteWebhookModal } from "../delete-webhook-modal";
import { WebHookInput } from "./input";
import { WebHookToggle } from "./toggle";
import { WEBHOOK_EVENTS, WebHookOptions, WebhookTypes } from "./options";
import { WebHookIndividualOptions, individualWebhookOptions } from "./option";
import { WebHookSubmitButton } from "./submit";
import { WebHookEditForm } from "./edit-form";

export enum WebHookFormTypes {
  EDIT = "edit",
  CREATE = "create",
}

interface IWebHookForm {
  type: WebHookFormTypes;
  initialData: IWebhook;
  onSubmit: (val: IExtendedWebhook) => void;
}

export const WebHookForm: FC<IWebHookForm> = observer((props) => {
  const { type, initialData, onSubmit } = props;
  // states
  const [openDeleteModal, setOpenDeleteModal] = useState(false);
  // use form
  const {
    reset,
    watch,
    handleSubmit,
    control,
    getValues,
    formState: { isSubmitting, errors },
  } = useForm<IExtendedWebhook>();

  const checkWebhookEvent = (initialData: IWebhook) => {
    const { project, module, cycle, issue, issue_comment } = initialData;
    if (!project || !cycle || !module || !issue || !issue_comment) {
      return WebhookTypes.INDIVIDUAL;
    }
    return WebhookTypes.ALL;
  };

  useEffect(() => {
    if (initialData && reset) reset({ ...initialData, webhook_events: checkWebhookEvent(initialData) });
  }, [initialData, reset]);

  useEffect(() => {
    if (!watch(WEBHOOK_EVENTS)) return;

    const allWebhookOptions: { [key: string]: boolean } = {};

    /**For Webhooks to return all the types */
    if (watch(WEBHOOK_EVENTS) === WebhookTypes.ALL) {
      individualWebhookOptions.forEach(({ name }) => {
        allWebhookOptions[name] = true;
      });
    } /**For Webhooks to return selected individual types, retain the saved individual types */ else if (
      watch(WEBHOOK_EVENTS) === WebhookTypes.INDIVIDUAL
    ) {
      individualWebhookOptions.forEach(({ name }) => {
        if (initialData[name] !== undefined) {
          allWebhookOptions[name] = initialData[name]!;
        } else {
          allWebhookOptions[name] = true;
        }
      });
    }

    reset({ ...getValues(), ...allWebhookOptions });
  }, [watch && watch(WEBHOOK_EVENTS)]);

  return (
    <>
      <DeleteWebhookModal
        isOpen={openDeleteModal}
        webhook_url=""
        onClose={() => {
          setOpenDeleteModal(false);
        }}
      />
      <form onSubmit={handleSubmit(onSubmit)}>
        <div className="space-y-8 py-5">
          <WebHookInput control={control} errors={errors} />
          <WebHookToggle control={control} />
          <div className="space-y-3">
            <WebHookOptions control={control} />
            {watch(WEBHOOK_EVENTS) === WebhookTypes.INDIVIDUAL && <WebHookIndividualOptions control={control} />}
          </div>
          <GenerateKey type={type} />
          <WebHookSubmitButton isSubmitting={isSubmitting} type={type} />
          {type === WebHookFormTypes.EDIT && <WebHookEditForm setOpenDeleteModal={setOpenDeleteModal} />}
        </div>
      </form>
    </>
  );
});