"use client";

import React, { useCallback, useEffect, useMemo, useState } from "react";
import SearchBox, { Criterion } from "../SearchBox";
import SearchResults, { Column } from "../SearchResults";
import { EditNote } from "@mui/icons-material";
import { useRouter, useSearchParams } from "next/navigation";
import { useTranslation } from "react-i18next";
import { ScheduleType } from "@/app/api/scheduling";
import {
  ProdScheduleResult,
  SearchProdSchedule,
  fetchDetailedProdSchedules,
  fetchProdSchedules,
  testDetailedSchedule,
} from "@/app/api/scheduling/actions";
import { defaultPagingController } from "../SearchResults/SearchResults";
import { arrayToDateString, arrayToDayjs, decimalFormatter } from "@/app/utils/formatUtil";
import dayjs from "dayjs";
import { orderBy, uniqBy, upperFirst } from "lodash";
import { Button, Stack } from "@mui/material";
import isToday from 'dayjs/plugin/isToday';
import useUploadContext from "../UploadProvider/useUploadContext";
dayjs.extend(isToday);

// may need move to "index" or "actions"
// type RecordStructure = {
//     id: number,
//     scheduledPeriod: string,
//     scheduledAt: string,
//     productCount: number,
// };

type Props = {
  type: ScheduleType;
  // records: RecordStructure[];
  defaultInputs: SearchProdSchedule;
};

type SearchQuery = Partial<
  Omit<SearchProdSchedule, "id" | "pageSize" | "pageNum">
>;
type SearchParamNames = keyof SearchQuery;

const DSOverview: React.FC<Props> = ({ type, defaultInputs }) => {
  const [filteredSchedules, setFilteredSchedules] = useState<
    ProdScheduleResult[]
  >([]);
  const { t } = useTranslation("schedule");
  const { setIsUploading } = useUploadContext();

  const router = useRouter();
  // const [filterObj, setFilterObj] = useState({});
  // const [tempSelectedValue, setTempSelectedValue] = useState({});
  const [pagingController, setPagingController] = useState(
    defaultPagingController,
  );
  const [totalCount, setTotalCount] = useState(0);
  const [inputs, setInputs] = useState(defaultInputs);
  const typeOptions = [
    {
      value: "detailed",
      label: t("Detailed"),
    },
    {
      value: "manual",
      label: t("Manual"),
    },
  ];

  const searchCriteria: Criterion<SearchParamNames>[] = useMemo(() => {
    const searchCriteria: Criterion<SearchParamNames>[] = [
      // {
      //   label: t("Schedule Period"),
      //   label2: t("Schedule Period To"),
      //   paramName: "schedulePeriod",
      //   type: "dateRange",
      // },
      { label: t("Production Date"), paramName: "scheduleAt", type: "date" },
      //{
      //  label: t("Product Count"),
      //  paramName: "totalEstProdCount",
      //  type: "text",
      //},
      //{
      //  label: t("Type"),
      //  paramName: "types",
      //  type: "autocomplete",
      //  options: typeOptions,
      //},
    ];
    return searchCriteria;
  }, [t]);

  // const onDetailClick = useCallback(
  //     (item: ItemsResult) => {
  //         router.push(`/settings/items/edit?id=${item.id}`);
  //     },
  //     [router]
  // );

  // const onDeleteClick = useCallback(
  //     (item: ItemsResult) => {},
  //     [router]
  // );

  const onDetailClick = (record: ProdScheduleResult) => {
    console.log("[debug] record", record);
    router.push(`/scheduling/detailed/edit?id=${record.id}`);
  };

  const columns = useMemo<Column<ProdScheduleResult>[]>(
    () => [
      {
        name: "id",
        label: t("Details"),
        onClick: (record) => onDetailClick(record),
        buttonIcon: <EditNote />,
      },
      // {
      //   name: "schedulePeriod",
      //   label: t("Demand Forecast Period"),
      //   renderCell: (params) => {
      //     return `${arrayToDateString(
      //       params.schedulePeriod,
      //     )} - ${arrayToDateString(params.schedulePeriodTo)}`;
      //   },
      // },
      {
        name: "produceAt",
        label: t("Production Date"),
        renderCell: (params) => {
          return arrayToDateString(params.produceAt);
        },
      },
      {
        name: "totalEstProdCount",
        label: t("Product Count(s)"),
        headerAlign: "right",
        align: "right",
        renderCell: (params) => {
          return decimalFormatter.format(params.totalEstProdCount);
        },
      },
      {
        name: "type",
        label: t("Type"),
        renderCell: (params) => {
          return upperFirst(t(params.type));
        },
      },
      // {
      //     name: "action",
      //     label: t(""),
      //     buttonIcon: <GridDeleteIcon />,
      //     onClick: onDeleteClick,
      // },
    ],
    [filteredSchedules],
  );

  const refetchData = useCallback(
    async (
      query: Record<SearchParamNames, string> | SearchProdSchedule,
      actionType: "reset" | "search" | "paging",
    ) => {
      // console.log(query)
      const defaultTypes = ["detailed", "manual"];
      const convertedTypes = (
        query.types == undefined || typeof query.types == "string"
          ? query.types?.toLowerCase() == "all"
            ? defaultTypes
            : [query.types]
          : query.types.some((ele) => ele.toLowerCase() === "all")
            ? defaultTypes
            : query.types
      ) as ScheduleType[];

      const params: SearchProdSchedule = {
        //scheduleAt: dayjs(query?.scheduleAt).isValid()
        //  ? query?.scheduleAt
        //  : undefined,
        //schedulePeriod: dayjs(query?.schedulePeriod).isValid()
         // ? query?.schedulePeriod
        //  : undefined,
        //schedulePeriodTo: dayjs(query?.schedulePeriodTo).isValid()
        //  ? query?.schedulePeriodTo
        //  : undefined,
        //totalEstProdCount: query?.totalEstProdCount
        //  ? Number(query?.totalEstProdCount)
        //  : undefined,
        types: convertedTypes,
        pageNum: pagingController.pageNum - 1,
        pageSize: pagingController.pageSize,
      };
      const response = await fetchDetailedProdSchedules(params);

      // console.log(response)
      if (response) {
        setTotalCount(response.total);
        switch (actionType) {
          case "reset":
          case "search":
            setFilteredSchedules(() => response.records);
            break;
          case "paging":
            setFilteredSchedules((fs) =>
            orderBy(
              uniqBy([...fs, ...response.records], "id"),
              ["id"], ["asc"]));
            break;
        }
      }
    },
    [pagingController, setPagingController],
  );

  useEffect(() => {
    refetchData(inputs, "paging");
  }, [pagingController]);

  // useEffect(() => {
  //     refetchData(filterObj);

  // }, [filterObj, pagingController.pageNum, pagingController.pageSize]);

  // const refetchData = async (filterObj: SearchQuery | null) => {

  //     const authHeader = axiosInstance.defaults.headers['Authorization'];
  //     if (!authHeader) {
  //         return; // Exit the function if the token is not set
  //     }

  //     const params = {
  //         pageNum: pagingController.pageNum,
  //         pageSize: pagingController.pageSize,
  //         ...filterObj,
  //         ...tempSelectedValue,
  //     }

  //     try {
  //         const response = await axiosInstance.get<ItemsResult[]>(`${NEXT_PUBLIC_API_URL}/items/getRecordByPage`, {
  //             params,
  //             paramsSerializer: (params) => {
  //                 return Qs.stringify(params, { arrayFormat: 'repeat' });
  //             },
  //         });
  //         //setFilteredItems(response.data.records);
  //         setFilteredItems([
  //             {
  //                 id: 1,
  //                 scheduledPeriod: "2025-05-11 to 2025-05-17",
  //                 scheduledAt: "2025-05-07",
  //                 productCount: 13,
  //             },
  //             {
  //                 id: 2,
  //                 scheduledPeriod: "2025-05-18 to 2025-05-24",
  //                 scheduledAt: "2025-05-14",
  //                 productCount: 15,
  //             },
  //             {
  //                 id: 3,
  //                 scheduledPeriod: "2025-05-25 to 2025-05-31",
  //                 scheduledAt: "2025-05-21",
  //                 productCount: 13,
  //             },
  //         ])
  //         setPagingController({
  //             ...pagingController,
  //             totalCount: response.data.total
  //         })
  //         return response; // Return the data from the response
  //     } catch (error) {
  //         console.error('Error fetching items:', error);
  //         throw error; // Rethrow the error for further handling
  //     }
  // };

  const onReset = useCallback(() => {
    //setFilteredItems(items ?? []);
    // setFilterObj({});
    // setTempSelectedValue({});
    refetchData(defaultInputs, "reset");
  }, []);

  const testDetailedScheduleClick = useCallback(async () => {
    try {
      setIsUploading(true)
      const response = await testDetailedSchedule(inputs.scheduleAt)
      if (response) {
        refetchData(inputs, "paging");
      }
    } catch(e) {
      console.log(e)
    } finally {
      setIsUploading(false)
    }
  }, [inputs])

  return (
    <>
      <Stack
        direction="row"
        justifyContent="flex-end"
        flexWrap="wrap"
        rowGap={2}
      >
        <Button
          variant="contained"
          onClick={testDetailedScheduleClick}
          // disabled={filteredSchedules.some(ele => arrayToDayjs(ele.scheduleAt).isToday())}
        >
          {t("Detailed Schedule")}
        </Button>
      </Stack>
      <SearchBox
        criteria={searchCriteria}
        onSearch={(query) => {
          setInputs(() => ({
            scheduleAt: query?.scheduleAt,
            schedulePeriod: query?.schedulePeriod,
            schedulePeriodTo: query?.schedulePeriodTo,
            totalEstProdCount: Number(query?.totalEstProdCount),
            types: query.types as unknown as ScheduleType[],
          }));
          refetchData(query, "search");
        }}
        onReset={onReset}
      />
      <SearchResults<ProdScheduleResult>
        items={filteredSchedules}
        columns={columns}
        setPagingController={setPagingController}
        pagingController={pagingController}
        totalCount={totalCount}
      // isAutoPaging={false}
      // hasCollapse={false}
      />
    </>
  );
};

export default DSOverview;
