"use client";

import { CreateGroupInputs, auth, saveGroup } from "@/app/api/group/actions";
import { useRouter } from "next/navigation";
import { useCallback, useState } from "react";
import { FieldErrors, FormProvider, SubmitHandler, useForm } from "react-hook-form";
import { useTranslation } from "react-i18next";
import { Button, Stack, Tab, Tabs, TabsProps, Typography } from "@mui/material";
import { Check, Close, Error } from "@mui/icons-material";
import GroupInfo from "./GroupInfo";
import AuthorityAllocation from "./AuthorityAllocation";
import UserAllocation from "./UserAllocation";
import { UserResult } from "@/app/api/user";

interface Props {
    auth?: auth[]
    users?: UserResult[]
}

const CreateGroup: React.FC<Props> = ({ auth, users }) => {
  const formProps = useForm<CreateGroupInputs>();
  const [serverError, setServerError] = useState("");
  const router = useRouter();
  const [tabIndex, setTabIndex] = useState(0);
  const { t } = useTranslation("group");

  const errors = formProps.formState.errors;

  const onSubmit = useCallback<SubmitHandler<CreateGroupInputs>>(
    async (data) => {
      try {
        console.log(data);
        const postData = {
          ...data,
          removeUserIds: [],
          removeAuthIds: [],
        }
        console.log(postData)
        await saveGroup(postData)
        router.replace("/settings/group")
      } catch (e) {
        console.log(e);
        console.log(data)
        if (!data.addUserIds || data.addUserIds.length == 0) {
          setServerError(t("Please allocate users."));
        } else if (!data.addAuthIds || data.addAuthIds.length == 0) {
          setServerError(t("Please allocate auths."));
        } else {
          setServerError(t("An error has occurred. Please try again later."));
        }
      }
    },
    [router]
  );
  
  const handleCancel = () => {
    router.back();
  };

  const handleTabChange = useCallback<NonNullable<TabsProps["onChange"]>>(
    (_e, newValue) => {
      setTabIndex(newValue);
    },
    []
  );

  const hasErrorsInTab = (
    tabIndex: number,
    errors: FieldErrors<CreateGroupInputs>,
  ) => {
    switch (tabIndex) {
        case 0:
            return Object.keys(errors).length > 0;
        default:
            false;
    }
  };

  return (
    <>
      <FormProvider {...formProps}>
        <Stack
          spacing={2}
          component="form"
          onSubmit={formProps.handleSubmit(onSubmit)}
        >
          <Tabs
            value={tabIndex}
            onChange={handleTabChange}
            variant="scrollable"
          >
            <Tab
              label={t("Group Info")}
              icon={
                hasErrorsInTab(0, errors) ? (
                  <Error sx={{ marginInlineEnd: 1 }} color="error" />
                ) : undefined
              }
              iconPosition="end"
            />
            <Tab label={t("Authority Allocation")} iconPosition="end" />
            <Tab label={t("User Allocation")} iconPosition="end" />
          </Tabs>
          {serverError && (
            <Typography variant="body2" color="error" alignSelf="flex-end">
              {serverError}
            </Typography>
          )}
          {tabIndex === 0 && <GroupInfo/>}
          {tabIndex === 1 && <AuthorityAllocation auth={auth!!}/>}
          {tabIndex === 2 && <UserAllocation users={users!!}/>}

          <Stack direction="row" justifyContent="flex-end" gap={1}>
            <Button
              variant="outlined"
              startIcon={<Close />}
              onClick={handleCancel}
            >
              {t("Cancel")}
            </Button>
            <Button
              variant="contained"
              startIcon={<Check />}
              type="submit"
              // disabled={Boolean(formProps.watch("isGridEditing"))}
            >
              {t("Confirm")}
            </Button>
          </Stack>
        </Stack>
      </FormProvider>
    </>
  );
};

export default CreateGroup;
