import Moment from 'moment';
import UserApi from '../../network/api/userApi';
import ActionType from '../actions/types';
import {getMyInfo} from './CommonAction';
import {convertTimeToFloat} from '../../components/common/common';
import AuthApi from '../../network/api/authApi';
import ApiUrl from '../../network/api/apiUrl';
export const postUserLeave = (staff_id, leave, pathImg) => {
  return async (dispatch, getState) => {
    try {
      const arrHourStart = leave.timeStart.split(':');
      const arrHourFinish = leave.timeFinish.split(':');

      var formatStart = Moment(leave.since).utcOffset(0);
      formatStart
        .set({
          hour: parseInt(arrHourStart[0] - 7),
          minute: arrHourStart[1],
          second: 0,
          millisecond: 0,
        })
        .toISOString();
      formatStart.format();
      var formatFinish = Moment(leave.toDate).utcOffset(0);
      formatFinish
        .set({
          hour: parseInt(arrHourFinish[0] - 7),
          minute: arrHourFinish[1],
          second: 0,
          millisecond: 0,
        })
        .toISOString();
      formatFinish.format();

      const payload = {
        start: formatStart,
        finish: formatFinish,
        reason: leave.reason,
        leave_category_id: leave.id,
        approver_id: leave.approver_id,
      };

      // console.log('payload', payload);
      const response = await UserApi.requestPostLeave(payload);

      // console.log('response postUserLeave', response.success);
      if (response.success) {
        const responseGetLatestLeavesDay =
          await UserApi.requestGetLatestLeavesDay();
        //console.log("response GetLatestLeavesDay", response)

        // get latest leave
        if (responseGetLatestLeavesDay.success) {
          const {collection} = responseGetLatestLeavesDay.data;
          if (!pathImg || pathImg.length === 0) {
            dispatch(getUserLeaves('', '', 1, 5));
            // dispatch(
            //   sendNotification(
            //     leave.approver_id,
            //     'Thông báo có yêu nghỉ phép',
            //     'Yêu cầu nghỉ phép mới từ ABC',
            //     203,
            //     200,
            //   ),
            // );
            return true;
          }
          const initPayload = {
            code: collection[0].id,
            file_name: '',
            file_size: '',
            name: '',
            sub_code: '0',
          };
          let payload = initPayload;
          pathImg.forEach(async (item, index) => {
            payload.file_name = item.fileName;
            payload.file_size = item.fileSize;
            payload.name = item.fileName;
            payload.sub_code = '0';
            const responsePostImage = await UserApi.requestPostImage(payload);
            //console.log('payload', payload);
            if (responsePostImage.success) {
              //console.log('responsePostConfirmDay.data.id', responsePostConfirmDay.data.id);
              let uploadImage = new FormData();
              uploadImage.append('file', {
                uri: item.uri,
                name: item.fileName,
                type: item.type,
              });
              // send image to server
              const responsePostUpload = await UserApi.requestPostUpload(
                responsePostImage.data.id,
                uploadImage,
              );
              if (responsePostUpload.success) {
                //console.log('responsePostUpload', responsePostUpload);
              }
            }
            payload = {
              code: collection[0].id,
              file_name: '',
              file_size: '',
              name: '',
              sub_code: '0',
            };
          });
          dispatch(getUserLeaves('', '', 1, 5));
          // dispatch(
          //   sendNotification(
          //     leave.approver_id,
          //     'Thông báo có yêu nghỉ phép',
          //     'Yêu cầu nghỉ phép mới từ ABC',
          //     203,
          //     200,
          //   ),
          // );
          return true;
        }
      } else {
        return response.success;
      }
    } catch (err) {
      console.error(err);
    }
  };
};
export const getRandomQuotation = () => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetRandomQuotation();
    //console.log("response getRandomQuotation", response);
    if (response.success) {
      dispatch({
        type: ActionType.GET_QUOTES_SUCCESS,
        data: response.data,
      });
      //console.log("getRandomQuotation sucess")
    }
  };
};
export const getBirthDayUserByDate = (mm, yy) => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetBirthdayUser(mm, yy);
    if (response.success) {
      dispatch({
        type: ActionType.GET_BIRTHDAY_USER_SUCCESS,
        data: response.data,
      });
    }
  };
};
export const getUserOTVoucher = (filter, sort, page, pageSize) => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetOtVoucher(
      filter,
      sort,
      page,
      pageSize,
    );
    if (response.success) {
      dispatch({
        type: ActionType.GET_OT_USER_SUCCESS,
        data: response.data.collection,
      });
      return response;
    }
  };
};
export const getUserOtVoucherPending = () => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetOtVoucherPending();

    //console.log("response GetOtVoucherPending", response);
    if (response.success) {
      dispatch({
        type: ActionType.GET_USER_OT_PENDING_SUCCESS,
        data: response.data.collection,
      });
    }
  };
};
export const getSalariesUser = staff_id => {
  return async (dispatch, getState) => {
    const responseGetBankAccount = await UserApi.requestGetBankAccount(
      staff_id,
    );
    //console.log("response getSalariesUser", responseGetBankAccount.data);
    if (responseGetBankAccount.success) {
      const resGetSaBook = await UserApi.requestGetSaBook();
      //console.log('resGetSaBook', resGetSaBook);
      if (resGetSaBook.success) {
        // const {sheet} = resGetSaBook.data;
        // //console.log("sheet", sheet.id)
        // const resGetSaPayslipSections =
        //   await UserApi.requestGetSaPayslipSections(sheet.id);
        // //console.log("resGetSaPayslipSections", resGetSaPayslipSections)
        // if (resGetSaPayslipSections.success) {
        //   const {collection} = resGetSaPayslipSections.data;
        //   //console.log('collection resGetSaPayslipSections', collection);
        //   const resGetSalary = await UserApi.requestGetSalary(
        //     collection[0].id,
        //     sheet.id,
        //   );
        //   //console.log("resGetSalary", resGetSalary)
        //   if (resGetSalary.success) {
        //     const resGetAllowance = await UserApi.requestGetAllowance(
        //       collection[0].id,
        //       sheet.id,
        //     );
        //     if (resGetAllowance.success) {
        //       //console.log("resGetAllowance", resGetAllowance)
        //       dispatch({
        //         type: ActionType.GET_USER_SALARY_SUCCESS,
        //         data: resGetSalary.data.collection,
        //         bank: responseGetBankAccount.data.collection,
        //         allowance: resGetAllowance.data.collection,
        //         saBooks: resGetSaBook.data.collection,
        //       });
        //     }
        //   }
        // }
        dispatch({
          type: ActionType.GET_USER_SALARY_SUCCESS,
          bank: responseGetBankAccount.data.collection,
          saBooks: resGetSaBook.data.collection,
        });
      }
      //console.log("requestPostLeave success")
    }
  };
};
export const getPaySlipSections = sheetId => {
  return async (dispatch, getState) => {
    const resGetUserSaSheet = await UserApi.requestGetUserPayslipSaBook(
      sheetId,
    );
    //console.log(' resGetUserSaSheet', resGetUserSaSheet);
    if (resGetUserSaSheet.success) {
      const {sheet} = resGetUserSaSheet.data;
      const resGetSaPayslipSections = await UserApi.requestGetSaPayslipSections(
        sheet.id,
      );

      if (resGetSaPayslipSections.success) {
        let arrSalary = [];
        const {collection} = resGetSaPayslipSections.data;
        //console.log('collection', collection);
        for (let i = 0; i < collection.length; i++) {
          const resGetSalary = await UserApi.requestGetSalary(
            collection[i].id,
            collection[i].sheet_id,
          );
          //console.log('resGetSalary', resGetSalary);
          if (resGetSalary.success) {
            const {collection} = resGetSalary.data;
            arrSalary.push(...collection);
          }
        }
        return arrSalary;
      }
    }
  };
};
export const getUserSheet = () => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetSheet();
    //console.log('response getUserSheet', response.data);
    if (response.success) {
      dispatch({
        type: ActionType.GET_USER_SALARY_SUCCESS,
        data: response.data.collection,
      });
      //console.log("requestPostLeave success")
    }
  };
};
export const getUserDirectManagers = () => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetMyDirectManagers();
    if (response.success) {
      dispatch({
        type: ActionType.GET_USER_MANAGERS_SUCCESS,
        data: response.data,
      });
      return response.data;
    }
  };
};
// get leader list
export const getManagers = () => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetMyManagers();
    if (response.success) {
      // dispatch({
      //   type: ActionType.GET_USER_MANAGERS_SUCCESS,
      //   data: response.data,
      // });
      return response;
    }
  };
};
export const getPersonnel = () => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetPersonnel();
    if (response.success) {
      const {collection} = response.data;
      //console.log(collection);
      return collection;
    }
  };
};

export const getUserLeaves = (filter, sort, page, pageSize) => {
  return async (dispatch, getState) => {
    //console.log('getUserLeaves');
    const response = await UserApi.requestGetLeavesDay(
      filter,
      sort,
      page,
      pageSize,
    );
    const resGetDataChartLeft = await UserApi.requestGetRestDay();
    if (response.success && resGetDataChartLeft.success) {
      dispatch({
        type: ActionType.GET_LEAVES_SUCCESS,
        data: response.data.collection,
        rest: resGetDataChartLeft.data.collection,
      });
      return response;
    }
  };
};
export const getUserLeavesPending = (filter, sort, page, pageSize) => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetLeavesDayPending(
      filter,
      sort,
      page,
      pageSize,
    );

    const resGetLeaveCategories = await UserApi.requestGetLeaveCategories();
    //console.log("response ", response);
    if (response.success) {
      if (resGetLeaveCategories.success) {
        dispatch({
          type: ActionType.GET_USER_LEAVES_PENDING_SUCCESS,
          data: response.data.collection,
          category: resGetLeaveCategories.data,
        });
        return response;
      }
    }
  };
};
export const getUserLeaveDayApproveReq = (filter, sort, page, pageSize) => {
  return async (dispatch, getState) => {
    // console.log(
    //   ApiUrl.LEAVES_DAY_APPROVE_REQ +
    //     `?Filters=${filter}&Sorts=${sort}&Page=${page}&PageSize=${pageSize}`,
    // );
    const response = await UserApi.requestGetLeaveDayApproveReq(
      filter,
      sort,
      page,
      pageSize,
    );
    const resGetLeaveCategories = await UserApi.requestGetLeaveCategories();
    //console.log("response ", response);
    if (response.success) {
      if (resGetLeaveCategories.success) {
        dispatch({
          type: ActionType.GET_USER_LEAVES_PENDING_SUCCESS,
          data: response.data.collection,
          category: resGetLeaveCategories.data,
        });
        return response;
      }
    }
  };
};
export const deleteLeaveTicket = ticketId => {
  return async (dispatch, getState) => {
    try {
      const resDeleteLeaveTicket = await UserApi.requestDeleteLeaveTicket(
        ticketId,
      );
      //console.log("response ", response);
      if (resDeleteLeaveTicket.success) {
        dispatch(getUserLeaves('', '', 1, 5));
        return true;
      }
      return false;
    } catch (err) {
      console.log('err', err);
    }
  };
};
export const getUserLeavesById = id => {
  return async (dispatch, getState) => {
    //console.log('getUserLeaves');
    const response = await UserApi.requestGetLeavesDayById(id);
    if (response.success) {
      return response.data;
    }
  };
};

// confirm date
export const getUserConfirmDay = (page, pageSize) => {
  return async (dispatch, getState) => {
    //console.log(ApiUrl.CONFIRM_DAY + `?Page=${page}&PageSize=${pageSize}`);
    const response = await UserApi.requestGetConfirmDay(page, pageSize);

    //console.log('response getUserConfirmDay', response);
    if (response.success) {
      //console.log('response getUserConfirmDay', response);
      dispatch({
        type: ActionType.GET_CONFIRM_DAY_SUCCESS,
        data: response.data.collection,
      });
      return response;
    }
  };
};
export const getApproveConfirmDay = (filter, sort, page, pageSize) => {
  return async (dispatch, getState) => {
    // console.log(
    //   ApiUrl.APPROVE_CONFIRM_DAY +
    //     `?Filters=${filter}&Sorts=${sort}&Page=${page}&PageSize=${pageSize}`,
    // );
    const response = await UserApi.requestGetApproveConfirmDay(
      filter,
      sort,
      page,
      pageSize,
    );
    //console.log("response getUserConfirmDay", response);
    if (response.success) {
      dispatch({
        type: ActionType.GET_APPROVE_CONFIRM_DAY_SUCCESS,
        data: response.data.collection,
      });
      return response;
    }
  };
};
export const getAbsentChart = () => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetAbsentChart();
    //console.log('response ', response);
    if (response.success) {
      return response.data;
    }
  };
};

export const deleteApproveConfirmDay = id => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestDeleteConfirmApprove(id);
    //console.log("response getUserConfirmDay", response);
    if (response.success) {
      dispatch(getUserConfirmDay(1, 5));
      return response;
    }
  };
};
//get confirm histories approve
export const getConfirmDayHistories = id => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetConfirmDayHistories(id);
    if (response.success) {
      return response.data.collection;
    }
  };
};
export const getTimeSheetProject = () => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetTimeSheetProject();
    // console.log("response getTimeSheetProject", response.data.collection);
    if (response.success) {
      const {collection} = response.data;
      dispatch({
        type: ActionType.GET_TIME_SHEET_PROJECT_SUCCESS,
        data: collection,
      });
      return collection;
    }
  };
};
export const getTimeSheetApprovalProject = (
  numberWeekOfYear,
  page,
  searchQuery,
) => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetTimeSheetApproval(
        numberWeekOfYear,
        page,
        searchQuery,
      );
      if (response.success) {
        return response.data;
      }
    } catch {
      console.log('Error when getTimeSheetApprovalProject');
    }
  };
};
export const getJobNameProject = projectId => {
  return async (dispatch, getState) => {
    const response = await UserApi.requestGetJobName(projectId);
    //console.log("response getJobNameProject", response);
    if (response.success) {
      const {collection} = response.data;
      // dispatch({
      //     type: ActionType.GET_TIME_SHEET_PROJECT_SUCCESS,
      //     data: collection,
      // })
      return collection;
    }
  };
};
export const postUserConfirmDay = (managerId, confirmInfo, pathImg) => {
  return async (dispatch, getState) => {
    //console.log(confirmInfo);
    const arrHourStart = Moment(confirmInfo.hourSince)
      .format('HH:mm')
      .split(':');
    const arrHourFinish = Moment(confirmInfo.hourFinish)
      .format('HH:mm')
      .split(':');
    let formatStart = Moment(confirmInfo.since)
      .utcOffset(0)
      .set('hour', 0)
      .set('minute', 0)
      .set('second', 0);
    formatStart.toISOString();
    formatStart.format();
    let formatFinish = Moment(confirmInfo.finish)
      .utcOffset(0)
      .set('hour', 0)
      .set('minute', 0)
      .set('second', 0);
    formatFinish.toISOString();
    formatFinish.format();
    if (parseInt(arrHourStart[0] - 7, 10) < 0) {
      formatStart.subtract(1, 'day');
    }
    if (parseInt(arrHourFinish[0] - 7, 10) < 0) {
      formatFinish.subtract(1, 'day');
    }
    formatStart
      .set('hour', parseInt(arrHourStart[0] - 7, 10))
      .set('minute', arrHourStart[1])
      .set('second', 0);
    formatFinish
      .set('hour', parseInt(arrHourFinish[0] - 7, 10))
      .set('minute', arrHourFinish[1])
      .set('second', 0);
    const payload = {
      approver_id: managerId,
      finish: formatFinish,
      reason: confirmInfo.reason,
      start: formatStart,
      timeFinish: Moment(confirmInfo.hourFinish).format('HH:mm'),
      timeStart: Moment(confirmInfo.hourSince).format('HH:mm'),
    };

    //console.log('payload', payload);
    const responsePostConfirmDay = await UserApi.requestPostConfirmDay(payload);

    //console.log('response getUserConfirmDay', responsePostConfirmDay);
    if (responsePostConfirmDay.success) {
      if (pathImg.length > 0) {
        const initPayload = {
          code: responsePostConfirmDay.data.id,
          file_name: '',
          file_size: '',
          name: '',
          sub_code: '0',
        };
        let payload = initPayload;
        pathImg.forEach(async (item, index) => {
          payload.file_name = item.fileName;
          payload.file_size = item.fileSize;
          payload.name = item.fileName;
          payload.sub_code = '0';
          const responsePostImage = await UserApi.requestPostImage(payload);
          //console.log('payload', payload);
          if (responsePostImage.success) {
            //console.log('responsePostConfirmDay.data.id', responsePostConfirmDay.data.id);
            let uploadImage = new FormData();
            uploadImage.append('file', {
              uri: item.uri,
              name: item.fileName,
              type: item.type,
            });
            // send image to server
            const responsePostUpload = await UserApi.requestPostUpload(
              responsePostImage.data.id,
              uploadImage,
            );
            if (responsePostUpload.success) {
              //console.log('responsePostUpload', responsePostUpload);
            }
          }
          payload = {
            code: responsePostConfirmDay.data.id,
            file_name: '',
            file_size: '',
            name: '',
            sub_code: '0',
          };
        });
        //console.log('arrPayload', arrPayload);
      }
      dispatch(getUserConfirmDay(1, 5));
      return responsePostConfirmDay;
      //console.log('responsePostConfirmDay.success');
    }
  };
};
export const postUserOTVoucher = (otVoucher, pathImg) => {
  return async (dispatch, getState) => {
    try {
      const arrHourStart = Moment(otVoucher.timeStart)
        .format('HH:mm')
        .split(':');
      const arrHourFinish = Moment(otVoucher.timeFinish)
        .format('HH:mm')
        .split(':');

      var formatStart = Moment(otVoucher.start).utcOffset(0);
      formatStart
        .set({
          hour: parseInt(arrHourStart[0] - 7),
          minute: arrHourStart[1],
          second: 0,
          millisecond: 0,
        })
        .toISOString();
      formatStart.format();
      var formatFinish = Moment(otVoucher.finish).utcOffset(0);
      formatFinish
        .set({
          hour: parseInt(arrHourFinish[0] - 7),
          minute: arrHourFinish[1],
          second: 0,
          millisecond: 0,
        })
        .toISOString();
      formatFinish.format();
      const payload = {
        approver_id: otVoucher.approver_id,
        start: formatStart,
        finish: formatFinish,
        reason: otVoucher.reason,
        timeFinish: Moment(otVoucher.timeFinish).format('HH:mm'),
        timeStart: Moment(otVoucher.timeStart).format('HH:mm'),
      };
      //console.log('Check payload', payload);
      const response = await UserApi.requestPostOTVoucher(payload);
      //console.log('postUserOTVoucher', response);
      if (response.success) {
        if (pathImg.length > 0) {
          const initPayload = {
            code: response.data.id,
            file_name: '',
            file_size: '',
            name: '',
            sub_code: '0',
          };
          let payload = initPayload;
          pathImg.forEach(async (item, index) => {
            payload.file_name = item.fileName;
            payload.file_size = item.fileSize;
            payload.name = item.fileName;
            payload.sub_code = '0';
            const responsePostImage = await UserApi.requestPostImage(payload);
            //console.log('payload', payload);
            if (responsePostImage.success) {
              //console.log('responsePostConfirmDay.data.id', responsePostConfirmDay.data.id);
              let uploadImage = new FormData();
              uploadImage.append('file', {
                uri: item.uri,
                name: item.fileName,
                type: item.type,
              });
              // send image to server
              const responsePostUpload = await UserApi.requestPostUpload(
                responsePostImage.data.id,
                uploadImage,
              );
              if (responsePostUpload.success) {
                console.log('responsePostUpload success');
              }
            }
            payload = {
              code: response.data.id,
              file_name: '',
              file_size: '',
              name: '',
              sub_code: '0',
            };
          });
          //console.log('arrPayload', arrPayload);
        }
        return true;
      } else {
        return false;
      }
    } catch (err) {
      console.log('Have error when call postUserOTVoucher:', err);
    }
  };
};

export const changeAvatar = (userID, pathImg) => {
  return async (dispatch, getState) => {
    let uploadImage = new FormData();
    for (let i = 0; i < pathImg.length; i++) {
      uploadImage.append('file', {
        uri: pathImg[i].uri,
        name: pathImg[i].fileName,
        type: pathImg[i].type,
      });
    }
    const responsePostUpload = await UserApi.requestChangeAvatar(
      userID,
      uploadImage,
    );
    //console.log("responsePostUpload", responsePostUpload)
    if (responsePostUpload.success) {
      //console.log("requestPostLeave success")
      dispatch(getMyInfo());
      return true;
    }
  };
};
export const changeCoverAvatar = (userID, pathImg) => {
  return async (dispatch, getState) => {
    let uploadImage = new FormData();
    for (let i = 0; i < pathImg.length; i++) {
      uploadImage.append('file', {
        uri: pathImg[i].uri,
        name: pathImg[i].fileName,
        type: pathImg[i].type,
      });
    }
    const responseChangeCoverAvatar = await UserApi.requestChangeCoverAvatar(
      userID,
      uploadImage,
    );
    //console.log('responseChangeCoverAvatar', responseChangeCoverAvatar);
    if (responseChangeCoverAvatar.success) {
      //console.log("requestPostLeave success")
      dispatch(getMyInfo());
      return true;
    }
  };
};

export const changeUserInfo = (userID, info) => {
  return async (dispatch, getState) => {
    const responseChangeInfo = await UserApi.requestChangeInfo(userID, info);
    //console.log("responseChangeInfo", responseChangeInfo)
    if (responseChangeInfo.success) {
      //console.log("requestPostLeave success")
      dispatch(getMyInfo());
      return true;
    }
  };
};

//OT
export const getMyOverTimeStatistic = () => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetOtVoucherStatisticChart();
      if (response.success) {
        return response.data;
      } else {
        console.log('Have error when getMyOverTimeStatistic');
      }
    } catch {
      console.log('Have error when getMyOverTimeStatistic');
    }
  };
};

export const getOTbyId = OTId => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetOtVoucherById(OTId);
      if (response.success) {
        return response.data;
      }
    } catch {
      console.log('Have error when getOTbyUserId');
    }
  };
};

export const getAttachmentByOTId = OTId => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetImageList(OTId);
      if (response.success) {
        return response.data.collection;
      }
    } catch {
      console.log('Have error when getAttachmentByOTId');
    }
  };
};

export const getOTHistoriesByOTId = OTId => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetOTHistoriesByID(OTId);
      if (response.success) {
        return response.data.collection;
      }
    } catch {
      console.log('Have error when getAttachmentByOTId');
    }
  };
};

export const postApproveOTVoucher = payload => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestPostApproveOTVoucher(payload);
      if (response.success) {
        return true;
      } else {
        return false;
      }
    } catch {
      console.log('Have error when postApproveOTVoucher');
    }
  };
};
export const postRejectOTVoucher = (otId, comment) => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestPostRejectOTVoucher(otId, comment);
      if (response.success) {
        dispatch(getApproveReqVoucherList(1, 5));
        return true;
      } else {
        return false;
      }
    } catch {
      console.log('Have error when postApproveOTVoucher');
    }
  };
};
export const deleteOtTicketRequest = OTId => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestDeleteOtVoucher(OTId);
      if (response.success) {
        dispatch(getUserOTVoucher('', '', 1, 5));
        return response.success;
      }
    } catch {
      console.log('Have error when getAttachmentByOTId');
    }
  };
};

// pending need approve
export const getApproveReqVoucherList = (filter, sort, page, pageSize) => {
  return async (dispatch, getState) => {
    try {
      // console.log(
      //   ApiUrl.GET_OT_VOUCHER_PENDING +
      //     `?Filter=${filter}&Sorts=${sort}&Page=${page}&PageSize=${pageSize}`,
      // );
      const response = await UserApi.requestGetOtApproveVoucherList(
        filter,
        sort,
        page,
        pageSize,
      );
      //console.log('getApproveReqVoucherList', response.data.collection);
      if (response.success) {
        dispatch({
          type: ActionType.GET_USER_OT_PENDING_SUCCESS,
          data: response.data.collection,
        });
        return response;
      }
    } catch {
      console.log('Have error when getMyOTVoucherList');
    }
  };
};

export const postNewComment = payload => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestPostComment(payload);
      if (response.success) {
        //console.log('run 100', response);
        return response.data;
      }
    } catch {
      console.log('Have error when postNewComment');
    }
  };
};

export const getCommentList = payload => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetComment(payload);
      if (response.success) {
        return response.result;
      }
    } catch {
      console.log('Have error when postNewComment');
    }
  };
};

export const postLikeComment = payload => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestPostCommentLike(payload);
      if (response.success) {
        return response.data;
      }
    } catch {
      console.log('Have error when postLikeComment');
    }
  };
};

export const getCommentByCode = code => {
  return async () => {
    const response = await UserApi.requestGetCommentByCode(code);
    if (response.success) {
      return response.data.collection;
    }
  };
};

export const postUserAddJob = (year, weekNumber, payload) => {
  return async (dispatch, getState) => {
    //console.log('payload', payload);
    try {
      const responsePostAddJob = await UserApi.requestPostAddJob(
        year,
        weekNumber,
        payload,
      );
      //console.log('responsePostAddJob', responsePostAddJob);
      if (responsePostAddJob.success) {
        return true;
      } else {
        return false;
      }
    } catch (e) {
      console.log('err postUserAddJob:', e);
      dispatch({
        type: ActionType.POST_JOB_OF_USER_FAILED,
      });
    }
  };
};
export const postSubmitUserAddJob = (week_id, approver_id, week_note) => {
  return async (dispatch, getState) => {
    //console.log("week_id", week_id,approver_id,week_note)
    try {
      const payload = {
        approver_id: approver_id,
        week_notes: week_note || null,
      };
      const responsePostSubmitAddJob = await UserApi.requestPostSubmitAddJob(
        week_id,
        payload,
      );
      //console.log("responsePostSubmitAddJob", responsePostSubmitAddJob)
      if (responsePostSubmitAddJob.success) {
        dispatch({
          type: ActionType.POST_JOB_OF_USER_SUCCESS,
        });
        return true;
      } else {
        return false;
      }
    } catch (e) {
      console.log('err postUserAddJob:', e);
      dispatch({
        type: ActionType.POST_JOB_OF_USER_FAILED,
      });
    }
  };
};
export const approveReqTimeSheet = timesheetId => {
  return async (dispatch, getState) => {
    try {
      //console.log('timesheetId', timesheetId);
      const response = await UserApi.requestApproveTimeSheet(timesheetId);
      console.log('approveReqTimeSheet', response);
      if (response.success) {
        return true;
      } else {
        return false;
      }
    } catch (e) {
      console.log('err approveReqTimeSheet:', e);
    }
  };
};
export const rejectReqTimeSheet = timesheetId => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestRejectTimeSheet(timesheetId);
      console.log('rejectReqTimeSheet', response);
      if (response.success) {
        return true;
      } else {
        return false;
      }
    } catch (e) {
      console.log('err approveReqTimeSheet:', e);
    }
  };
};
export const getUserJob = (year, weekNumber) => {
  return async (dispatch, getState) => {
    //console.log("weekNumber", weekNumber)
    try {
      dispatch({
        type: ActionType.START_GET_JOB_OF_USER,
      });
      const responseGetMyTimeSheet = await UserApi.requestGetMyTimeSheet(
        year,
        weekNumber,
      );
      //console.log("getUserJob", responseGetMyTimeSheet)
      if (responseGetMyTimeSheet.success) {
        //console.log("requestPostLeave success")
        dispatch({
          type: ActionType.GET_JOB_OF_USER_SUCCESS,
        });
        return responseGetMyTimeSheet.data;
      } else {
        dispatch({
          type: ActionType.GET_JOB_OF_USER_FAILED,
        });
      }
    } catch (e) {
      console.error('err:', e);
      dispatch({
        type: ActionType.GET_JOB_OF_USER_FAILED,
      });
    }
  };
};

export const getDescriptionTimekeeping = (filter, page, pageSize, sort) => {
  return async (dispatch, getState) => {
    try {
      // console.log(
      //   'options',
      //   ApiUrl.GET_TIME_KEEPING_BY_FILTER +
      //     `?Filters=${filter}&Sorts=${sort}&Page=${page}&PageSize=${pageSize}`,
      // );
      const response = await UserApi.requestGetTimeKeeping(
        filter,
        page,
        pageSize,
        sort,
      );
      //console.log(response)
      if (response.success) {
        //console.log("finish", options)

        return response.data;
      }
    } catch (err) {
      console.error('err getDescriptionTimekeeping', err);
      dispatch({
        type: ActionType.GET_TIME_KEEPING_FAILED,
      });
    }
  };
};
export const getDataChartTimekeeping = (since, finish) => {
  return async (dispatch, getState) => {
    dispatch({
      type: ActionType.START_GET_DATA_CHART,
    });
    const response = await UserApi.requestDataChartTimeKeeping(since, finish);
    //console.log(response)
    if (response.success) {
      //console.log("finish", options)
      dispatch({
        type: ActionType.GET_DATA_CHART_SUCCESS,
      });
      return response.data;
    } else {
      dispatch({
        type: ActionType.GET_DATA_CHART_FAILED,
      });
    }
  };
};

export const postAttachmentToComment = (commentId, payload) => {
  return async (dispatch, getState) => {
    try {
      let uploadImage = new FormData();
      for (let i = 0; i < payload.length; i++) {
        uploadImage.append('file', {
          uri: payload[i].uri,
          name: payload[i].fileName,
          type: payload[i].type,
        });
      }
      console.log('check fomr data', uploadImage);
      console.log('cehck comment id', commentId);
      const response = await UserApi.requestPostAttachmentComment(
        commentId,
        uploadImage,
      );
      if (response.success) {
        return response.data;
      }
    } catch {
      console.log('Have error when postAttachmentToComment');
    }
  };
};

export const getUserLeaveHistories = id => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetLeaveHistories(id);
      if (response.success) {
        return response.data.collection;
      }
    } catch {
      console.log('error when take user leave histories');
    }
  };
};

export const postComment = payload => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestPostComment(payload);
      if (response.success) {
        return true;
      }
    } catch (error) {
      console.log('error when take comment', error);
    }
  };
};
export const postApproveLeaveDay = (id, comment, nextApproverId) => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestPostLeaveApprove(
        id,
        comment,
        nextApproverId,
      );
      if (response.success) {
        // dispatch(getUserLeavesPending('', '', 1, 5));
        return true;
      }
    } catch (error) {
      console.log('error when take approve leave days', error);
    }
  };
};
export const postRejectLeaveDay = (id, comment) => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestPostLeaveReject(id, comment);
      if (response.success) {
        return true;
      }
    } catch (error) {
      console.log('error when take reject leave day', error);
    }
  };
};
export const getImageByCode = code => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetImage(code);
      //console.log("getImageByCode", code)
      if (response.success) {
        return response.data.collection;
      }
    } catch (error) {
      console.log('error when take image', error);
    }
  };
};
export const getContactUser = userID => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetContactUser(userID);
      //console.log("response", response)
      if (response.success) {
        return response.data.collection;
      }
    } catch (error) {
      console.log('error when take image', error);
    }
  };
};
export const changeContactUser = (itemId, contact_unique_id, type) => {
  return async (dispatch, getState) => {
    try {
      //console.log("itemId", itemId, contact_unique_id, type)
      const payload = {
        contact_unique_id: contact_unique_id,
        type: type,
      };
      const response = await UserApi.requestChangeContactUser(itemId, payload);
      //console.log("response", response)
      return response;
    } catch (error) {
      console.log('error ', error);
    }
  };
};
export const deleteContactUser = itemId => {
  return async (dispatch, getState) => {
    try {
      //console.log("itemId", itemId)
      const response = await UserApi.requestDeleteContactUser(itemId);
      //console.log('response', response);
      return response;
    } catch (error) {
      console.log('error ', error);
    }
  };
};
export const addContactUser = (userId, contact_unique_id, type) => {
  return async (dispatch, getState) => {
    try {
      //console.log("itemId", itemId)
      const payload = {
        contact_unique_id: contact_unique_id,
        type: type,
      };
      const response = await UserApi.requestAddContactUser(userId, payload);
      //console.log("response", response)
      if (response.success) return response;
    } catch (error) {
      console.log('error ', error);
    }
  };
};
export const sendEmail = email => {
  return async (dispatch, getState) => {
    try {
      //console.log("itemId", itemId)

      const response = await AuthApi.requestSendMail(email);
      console.log('response', response);
      return response;
    } catch (error) {
      console.log('error ', error);
    }
  };
};
export const postApproveConfirmDate = (id, comment, nextApproverId) => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestPostConfirmApprove(
        id,
        (comment && comment) || '',
        nextApproverId,
      );
      if (response.success) {
        return true;
      }
    } catch (error) {
      console.log('something error in approve', error);
    }
  };
};
export const postRejectConfirmDate = (id, comment) => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestPostRejectApprove(id, comment);
      if (response.success) {
        return true;
      }
    } catch (error) {
      console.log('something error in reject', error);
    }
  };
};
export const getRangeTimeStart = (startDate, userID) => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetRangeTimeStart(
        startDate,
        userID,
      );
      if (response.success) {
        //list
        return response.data;
      }
    } catch (error) {
      console.log('something error in get range date start', error);
    }
  };
};
export const getRangeTimeFinish = (startDate, userID) => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetRangeTimeFinish(
        startDate,
        userID,
      );
      if (response.success) {
        //list
        return response.data;
      }
    } catch (error) {
      console.log('something error in get range date finish', error);
    }
  };
};

export const getConfirmSheetDetail = (userId, numberOfWeek, year) => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetConfirmTimeSheetDetail(
        userId,
        year,
        numberOfWeek,
      );
      //console.log('response', response);
      if (response.success) {
        return response.data;
      }
    } catch (error) {
      console.log('something error in getConfirmSheetDetail', error);
    }
  };
};

export const getUserInfoById = userId => {
  return async (dispatch, getState) => {
    try {
      const response = await UserApi.requestGetUserInfoById(userId);
      if (response.success) {
        return response.data;
      }
    } catch (error) {
      console.log('something error in getUserInfoById', error);
    }
  };
};
// notification
export const getNotificationOfUser = queryParams => {
  return async dispatch => {
    try {
      //console.log(ApiUrl.GET_NOTIFICATION + queryParams);
      const response = await UserApi.requestGetNotification(queryParams);
      //console.log("response", response.data);
      if (response.success) {
        const {collection} = response.data;
        return collection;
      } else {
        console.log('Have error when getNotificationOfUser');
      }
    } catch {
      console.log('Have error when getNotificationOfUser');
    }
  };
};
export const readNotificationUser = id => {
  return async dispatch => {
    try {
      const response = await UserApi.requestReadNotification(id);
      //console.log("response", response);
      if (response.success) {
        return response;
      } else {
        console.log('Have error when readNotificationUser');
      }
    } catch {
      console.log('Have error when readNotificationUser');
    }
  };
};
export const deleteNotificationUser = id_noti => {
  return async dispatch => {
    try {
      const response = await UserApi.requestDeleteNotification(id_noti);
      if (response.success) {
        return response;
      } else {
        console.log('Have error when deleteNotificationUser');
      }
    } catch {
      console.log('Have error when deleteNotificationUser');
    }
  };
};
// getCompanyInfo
export const getCompanyInfo = () => {
  return async dispatch => {
    try {
      const response = await UserApi.requestGetCompanyInfo();
      //console.log("response", response.data);
      if (response.success) {
        return response;
      } else {
        console.log('Have error when getCompanyInfo');
      }
    } catch {
      console.log('Have error when getCompanyInfo');
    }
  };
};
// notification
export const sendNotification = (
  approver_id,
  sender_id,
  img,
  title,
  message,
  type,
  code_group,
) => {
  return async dispatch => {
    try {
      //console.log('img', img);
      if (img && img.length > 0) {
        const payloadImg = {
          code: approver_id,
          file_name: img[0].file_name,
          file_size: img[0].file_size,
          name: img[0].file_name,
          sub_code: '0',
        };

        const responsePostImage = await UserApi.requestPostImage(payloadImg);
        //console.log('responsePostImage', responsePostImage);
        if (responsePostImage.success) {
          //console.log('responsePostConfirmDay.data.id', responsePostConfirmDay.data.id);
          let uploadImage = new FormData();
          uploadImage.append('file', {
            uri: img[0].uri,
            name: img[0].fileName,
            type: img[0].type,
          });
          // send image to server
          const responsePostUpload = await UserApi.requestPostPublicUpload(
            responsePostImage.data.id,
            uploadImage,
          );
          if (responsePostUpload.success) {
            const {data} = responsePostUpload;
            const payload = {
              sTitle: title,
              sDetails: message,
              type: type,
              sCodeForGrouping: code_group,
            };
            const response = await UserApi.requestSenNotificationByUserId(
              approver_id,
              sender_id,
              data.physical_path,
              payload,
            );
            //console.log('response', response);
            if (response.success) {
              console.log('requestSenNotificationByUserId with image success');
              return response;
            } else {
              console.log('Have error when sendNotification');
            }
            //console.log('responsePostUpload', responsePostUpload);
          }
        }
      } else {
        const payload = {
          sTitle: title,
          sDetails: message,
          type: type,
          sCodeForGrouping: code_group,
        };
        const response = await UserApi.requestSenNotificationByUserId(
          approver_id,
          sender_id,
          '',
          payload,
        );
        //console.log('response', response);
        if (response.success) {
          console.log('requestSenNotificationByUserId no image success');
          return response;
        } else {
          console.log('Have error when sendNotification');
        }
      }
    } catch {
      console.log('Have error when sendNotification');
    }
  };
};