import { useRouter } from "next/router";
import { observer } from "mobx-react-lite";

// mobx store
import { useMobxStore } from "lib/mobx/store-provider";
// components
import {
  CheckboxAttributeForm,
  DateTimeAttributeForm,
  EmailAttributeForm,
  FileAttributeForm,
  NumberAttributeForm,
  RelationAttributeForm,
  SelectAttributeForm,
  TextAttributeForm,
  UrlAttributeForm,
} from "components/custom-attributes";
// types
import { ICustomAttribute, TCustomAttributeTypes } from "types";

type Props = {
  attributeDetails: ICustomAttribute;
  objectId: string;
  type: TCustomAttributeTypes;
};

export const AttributeForm: React.FC<Props> = observer((props) => {
  const { attributeDetails, objectId, type } = props;

  const router = useRouter();
  const { workspaceSlug } = router.query;

  const { customAttributes } = useMobxStore();

  const handleUpdateAttribute = async (data: Partial<ICustomAttribute>) => {
    if (!workspaceSlug || !attributeDetails.id || !objectId) return;

    await customAttributes.updateObjectAttribute(
      workspaceSlug.toString(),
      objectId,
      attributeDetails.id,
      data
    );
  };

  const handleDeleteAttribute = async () => {
    if (!workspaceSlug || !attributeDetails.id || !objectId) return;

    await customAttributes.deleteObjectAttribute(
      workspaceSlug.toString(),
      objectId,
      attributeDetails.id
    );
  };

  switch (type) {
    case "checkbox":
      return (
        <CheckboxAttributeForm
          attributeDetails={attributeDetails}
          handleDeleteAttribute={handleDeleteAttribute}
          handleUpdateAttribute={handleUpdateAttribute}
        />
      );
    case "datetime":
      return (
        <DateTimeAttributeForm
          attributeDetails={attributeDetails}
          handleDeleteAttribute={handleDeleteAttribute}
          handleUpdateAttribute={handleUpdateAttribute}
        />
      );
    case "email":
      return (
        <EmailAttributeForm
          attributeDetails={attributeDetails}
          handleDeleteAttribute={handleDeleteAttribute}
          handleUpdateAttribute={handleUpdateAttribute}
        />
      );
    case "file":
      return (
        <FileAttributeForm
          attributeDetails={attributeDetails}
          handleDeleteAttribute={handleDeleteAttribute}
          handleUpdateAttribute={handleUpdateAttribute}
        />
      );
    case "multi_select":
      return (
        <SelectAttributeForm
          attributeDetails={attributeDetails}
          handleDeleteAttribute={handleDeleteAttribute}
          handleUpdateAttribute={handleUpdateAttribute}
          multiple
        />
      );
    case "number":
      return (
        <NumberAttributeForm
          attributeDetails={attributeDetails}
          handleDeleteAttribute={handleDeleteAttribute}
          handleUpdateAttribute={handleUpdateAttribute}
        />
      );
    case "relation":
      return (
        <RelationAttributeForm
          attributeDetails={attributeDetails}
          handleDeleteAttribute={handleDeleteAttribute}
          handleUpdateAttribute={handleUpdateAttribute}
        />
      );
    case "select":
      return (
        <SelectAttributeForm
          attributeDetails={attributeDetails}
          handleDeleteAttribute={handleDeleteAttribute}
          handleUpdateAttribute={handleUpdateAttribute}
        />
      );
    case "text":
      return (
        <TextAttributeForm
          attributeDetails={attributeDetails}
          handleDeleteAttribute={handleDeleteAttribute}
          handleUpdateAttribute={handleUpdateAttribute}
        />
      );
    case "url":
      return (
        <UrlAttributeForm
          attributeDetails={attributeDetails}
          handleDeleteAttribute={handleDeleteAttribute}
          handleUpdateAttribute={handleUpdateAttribute}
        />
      );
    default:
      return null;
  }
});