import { ReactElement, useEffect, useState } from "react";
import Card from "../../base/Card"
import { APIUrl, assetEndpointURL, careerId, committeeId, coorganiserId, eventId, eventTypeId, localBODId, localChapterId, membershipFeePaymentsId, nationalBODId, permissionEntryId, permissionId, pointHistoryId, positionId, registrationId, registrationQuestionId, registrationResponseId, roleId, tagEntryId, tagId, trainingHourId, userId } from "@/src/database/database";
import { DataStructure, SelectRequestBody, UpdateRequestBody } from "../../base/DataStructure";
import { DataTable } from "../../base/DataTable";
// import { IndustrySchema } from "@/src/database/models/industry";
// import { OperationSchema } from "@/src/database/models/operation";
// import { OperationEntrySchema } from "@/src/database/models/operationEntry";
// import { ProductSchema } from "@/src/database/models/product";
// import { ProductEntrySchema } from "@/src/database/models/productEntry";
// import { QuestionSchema } from "@/src/database/models/question";
// import { QuestionGroupSchema } from "@/src/database/models/questionGroup";
// import { SubmissionSchema } from "@/src/database/models/submission";
// import { SubmissionEntrySchema } from "@/src/database/models/submissionEntry";
import { UserSchema } from "@/src/database/models/user";
import { Button } from "../../base/Button";
import { useRouter } from "next/navigation";
// import { CreditHistorySchema } from "@/src/database/models/creditHistory";
import axios from "axios";
import { LocalChapterSchema } from "@/src/database/models/localChapter";
import { RoleSchema } from "@/src/database/models/role";
import { MembershipFeePaymentSchema } from "@/src/database/models/membershipFeePayment";
import { CareerSchema } from "@/src/database/models/career";
import { PermissionSchema } from "@/src/database/models/permission";
import { PermissionEntrySchema } from "@/src/database/models/permissionEntry";
import { LocalBODSchema } from "@/src/database/models/localBOD";
import { NationalBODSchema } from "@/src/database/models/nationalBOD";
import { PositionSchema } from "@/src/database/models/position";
import { EventTypeSchema } from "@/src/database/models/eventType";
import { EventSchema } from "@/src/database/models/event";
import { TagSchema } from "@/src/database/models/tag";
import { TagEntrySchema } from "@/src/database/models/tagEntry";
import { CoOrganiserSchema } from "@/src/database/models/coOrganiser";
import { CommitteesSchema } from "@/src/database/models/committees";
import { TrainingHourSchema } from "@/src/database/models/trainingHour";
import { RegistrationSchema } from "@/src/database/models/registration";
import { RegistrationQuestionSchema } from "@/src/database/models/registrationQuestion";
import { RegistrationResponseSchema } from "@/src/database/models/registrationResponse";
import { PointHistorySchema } from "@/src/database/models/pointHistory";

interface Props{
  id: string;
}

export const DashboardPage = (props: Props) => {

  const [modelSchema, setModelSchema] = useState<DataStructure[]>([]);
  const [pageNumber, setPageNumber] = useState<number>(1);
  const [viewType, setViewType] = useState<"list" | "update" | "read" | "create">("list");
  const [dataId, setDataId] = useState<string>('');
  const endPointURL = `${APIUrl}/api/select`;
  const insertEndPointURL = `${APIUrl}/api/insert`;
  const updateEndPointURL = `${APIUrl}/api/update`;
  const deleteEndPointURL = `${APIUrl}/api/delete`;
  const uploadEndPointURL = `${APIUrl}/api/fileUpload`;
  const [customReadComponent, setCustomReadComponent] = useState<ReactElement>();
  const [userStorageId, setUserStorageId] = useState<string>();
  const [userData, setUserData] = useState<any>({});
  const router = useRouter();

  useEffect(() => {
    // const id = localStorage.getItem('userId');
    // if(id){
    //   setUserStorageId(id);
    // }else{
    //   router.push('/auth');
    // }
  }, []);

  /*useEffect(() => {
    handleDataSettings();
  }, [dataId]);*/

  useEffect(() => {
    handleTableSettings();
  }, [props]);

  useEffect(() => {
    //handleUserData();
  }, [userStorageId]);

  const handleUserData = async () => {
    
    const columns = ['credit', 'user_type'];
    const formData = new FormData();
    const selectQuery: SelectRequestBody = {
      table: "users",
      columns: columns,
      where: [
        {
         condition: [
          {
            queryColumn: 'id',
            value: userStorageId ?? "",
            operator: "="
          }
         ] 
        }
      ],
      limit: 1,
    };

    formData.append('query', JSON.stringify(selectQuery));

    try {
      const queryRes = await axios.post(endPointURL, formData, {
        headers: {
          'Content-Type': 'multipart/form-data',
        },
      });
      if(queryRes.data && queryRes.data["rows"] && queryRes.data["rows"][0]){
        setUserData(queryRes.data["rows"][0]);
        if(queryRes.data['rows'][0].user_type === 1){
          router.push('/user/dashboard');
        }
      }
    }catch(err) {}

  };

  /*const handleCreditUpdateWorkflow = async (previousData: any, id: string) => {
    const columns = ['user_id', 'status']
    const formData = new FormData();
    const selectQuery: SelectRequestBody = {
      table: creditHistoryId,
      columns: columns,
      where: [
        {
         condition: [
          {
            queryColumn: 'id',
            value: id,
            operator: "="
          }
         ] 
        }
      ],
      limit: 1,
    };*/

    /*formData.append('query', JSON.stringify(selectQuery));
    try {
      const queryRes = await axios.post(endPointURL, formData, {
        headers: {
          'Content-Type': 'multipart/form-data',
        },
      });
      if(queryRes.data && queryRes.data["rows"] && queryRes.data["rows"][0]){
        const retrievedData = queryRes.data["rows"][0];
        if( (Object.keys(previousData).length > 0 && previousData.status == 1 && retrievedData.status == 2)
          || (Object.keys(previousData).length === 0 && retrievedData.status == 2)){
            const columns = ["credit"]
            const formData = new FormData();
            const selectQuery: SelectRequestBody = {
              table:userId,
              columns: columns,
              where: [
                {
                 condition: [
                  {
                    queryColumn: 'id',
                    value: retrievedData.user_id,
                    operator: "="
                  }
                 ] 
                }
              ],
              limit: 1,
            };
        
            formData.append('query', JSON.stringify(selectQuery));

            try{
              const queryRes = await axios.post(endPointURL, formData, {
                headers: {
                  'Content-Type': 'multipart/form-data',
                },
              });
              if(queryRes.data && queryRes.data["rows"] && queryRes.data["rows"][0]){
                const credit = queryRes.data["rows"][0].credit + 1;
                const columns = ["credit"];
                const formData = new FormData();
                const updateQuery: UpdateRequestBody = {
                  table:userId,
                  columns: columns,
                  values: [credit],
                  where: [
                    {
                     condition: [
                      {
                        queryColumn: 'id',
                        value: retrievedData.user_id,
                        operator: "="
                      }
                     ] 
                    }
                  ],
                };
            
                formData.append('query', JSON.stringify(updateQuery));
                try{
                  await axios.post(updateEndPointURL, formData, {
                    headers: {
                      'Content-Type': 'multipart/form-data',
                    },
                  });
                }catch(err){}
              }
            }catch(err) {}
        }
      }
    }catch(err) {}
    
  }*/

  /*const handleDataSettings = () => {
    switch(props.id){
      case submissionId: 
        setCustomReadComponent(
          <Button text={"View PDF"} size="md" additionalClassName="block rounded border border-primary-400" bgColor="bg-white" color="text-primary-400" onClick={() => {
            router.push(`/result/${dataId}`)
          }} />
        )
        break;
    }
  }*/

  const handleTableSettings = () => {
    let localUpdateWorkflow: any;
    switch(props.id){
      case userId:
        setModelSchema(UserSchema);
        break;
      case localChapterId:
        setModelSchema(LocalChapterSchema);
        break;
      case roleId:
        setModelSchema(RoleSchema);
        break;
      case membershipFeePaymentsId:
        setModelSchema(MembershipFeePaymentSchema);
        break;
      case careerId:
        setModelSchema(CareerSchema);
        break;
      case permissionId:
        setModelSchema(PermissionSchema);
        break;
      case permissionEntryId:
        setModelSchema(PermissionEntrySchema);
        break;
      case localBODId:
        setModelSchema(LocalBODSchema);
        break;
      case nationalBODId:
        setModelSchema(NationalBODSchema);
        break;
      case positionId:
        setModelSchema(PositionSchema);
        break;
      case eventTypeId:
        //localUpdateWorkflow = handleCreditUpdateWorkflow;
        setModelSchema(EventTypeSchema);
        break;
      case eventId:
        setModelSchema(EventSchema);
        break;
      case tagId:
        setModelSchema(TagSchema);
        break;
      case tagEntryId:
        setModelSchema(TagEntrySchema);
        break;
      case coorganiserId:
        setModelSchema(CoOrganiserSchema);
        break;
      case committeeId:
        setModelSchema(CommitteesSchema);
        break;
      case trainingHourId:
        setModelSchema(TrainingHourSchema);
        break;
      case registrationId:
        setModelSchema(RegistrationSchema);
        break;
      case registrationQuestionId:
        setModelSchema(RegistrationQuestionSchema);
        break;
      case registrationResponseId:
        setModelSchema(RegistrationResponseSchema);
        break;
      case pointHistoryId:
        setModelSchema(PointHistorySchema);
        break;
    }

  }

  const handlePagination = (type: "page" | "prev" | "next", pagesNumber: number, page?: number) => {
    switch(type){
      case "prev":
        if(pageNumber !== 1)
          setPageNumber(pageNumber - 1);
        break;
      case "next":
        if(pageNumber < pagesNumber)
          setPageNumber(pageNumber + 1);
        break;
      case "page":
        setPageNumber(page ?? 0);
    }
  }

  const handleNavigate = (viewType: "list" | "update" | "read" | "create", dataId?: string) => {
    setViewType(viewType);
    if(dataId){
      setDataId(dataId);
    }
  }

  return (
    <Card
      containerClassName="bg-white shadow-md w-full rounded-md">
      <DataTable
        endPointURL={endPointURL}
        insertEndPointURL={insertEndPointURL}
        updateEndPointURL={updateEndPointURL}
        deleteEndPointURL={deleteEndPointURL}
        uploadEndPointURL={uploadEndPointURL}
        assetEndpointURL={assetEndpointURL}
        modelSchema={modelSchema}
        collectionId={props.id}
        limit={10}
        page={pageNumber}
        viewType={viewType}
        dataId={dataId}
        handlePagination={handlePagination}
        handleNavigate={handleNavigate}
        customSetting={{
          customReadComponent: customReadComponent
        }}
        userAccess="Admin"
        /*handleUpdateWorkflow={(previousData: any, id: string) => {
          if(props.id === creditHistoryId){
            handleCreditUpdateWorkflow(previousData, id);
          }
        }}*/
      />
    </Card>
  )
}