import { PayloadAction, createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { RootState } from './rootReducer';
import {fetchAll} from './dataSlice';
import axios from 'B/axios';
import moment from 'moment';

export type TimeType = 'starttime' | 'endtime';
const initialState = {
  isOpen: false,
  ergID: null,
  date: '',
  time: '',
  timeType: null,
  isError: false
};

const requestTimeUpdate = createAsyncThunk(
  'monitorpage/edit_time_dialog/update_time',
  async (_args, thunkAPI) => {
    const {
      ergID,
      timeType,
      date,
      time
    } = (thunkAPI.getState() as RootState).editTimeDialog;
    const action = timeType === 'starttime' ? 'stz' : 'edz';

    await axios.post('/comission/TimeControl/endtime', {
      action,
      zeit: `${date} ${time}`,
      id: ergID
    });

    await thunkAPI.dispatch(fetchAll());
  }
);

const slice = createSlice({
  name: 'monitorpage/edit_time_dialog',
  initialState,
  reducers: {
    setOpen(
      state,
      {
        payload
      }: PayloadAction<{ ergID: number; datetime: string; timeType: TimeType }>
    ) {
      // seperate time and day
      const dt = moment(payload.datetime);
      const isValidDate = dt.isValid();
      if (isValidDate === false) {
        state.isError = true;
        return;
      }

      state.date = dt.format('YYYY-MM-DD');
      state.time = dt.format('HH:mm:ss');
      state.isOpen = true;
      state.ergID = payload.ergID;
      state.timeType = payload.timeType;
    },
    setClose(state) {
      state.isOpen = false;
      state.ergID = null;
      state.timeType = null;
      state.isError = false;
    },
    setDate(state, { payload }: PayloadAction<string>) {
      state.date = payload;
    },
    setTime(state, { payload }: PayloadAction<string>) {
      state.time = payload;
    }
  },
  extraReducers: (builder) => {
    builder
      .addCase(requestTimeUpdate.fulfilled, (state) => {
        state.isOpen = false;
        state.ergID = null;
        state.timeType = null;
        state.isError = false;
      })
      .addCase(requestTimeUpdate.rejected, (state) => {
        state.isError = true;
      });
  }
});

export const { setOpen, setClose, setDate, setTime } = slice.actions;
export { requestTimeUpdate };
export default slice.reducer;
