import {
  ABSENT_CHANGE,
  ADD_EVENT,
  CHANGE_NO,
  DELETE_EVENT,
  GET_EVENTS,
  GET_EVENT_BY_ID,
  GET_PROFILES,
  GET_SELECTED_PROFILE,
  GET_TRAINEES,
  SET_STATUS,
  VISITOR_CHANGE,
  WRITE_EVENT,
} from './types';

import axios from './session';

export const getStaffEvents = () => async (dispatch) => {
  try {
    const response = await axios.get('/api/v1/staff_events/');
    dispatch({
      type: GET_EVENTS,
      payload: response.data,
    });
  } catch (e) {
    console.log(e);
  }
};

export const getStudentEvents = () => async (dispatch) => {
  try {
    const response = await axios.get('/api/v1/student_events/');
    dispatch({
      type: GET_EVENTS,
      payload: response.data,
    });
  } catch (e) {
    console.log(e);
  }
};

export const getEventById = (id) => async (dispatch) => {
  try {
    const response = await axios.get(`/api/v1/staff_events/${id}`);
    dispatch({
      type: GET_EVENT_BY_ID,
      payload: response.data,
    });
  } catch (e) {
    console.log(e);
  }
};

export const getTrainees = () => async (dispatch) => {
  try {
    const response = await axios.get('/api/v1/profiles/');
    dispatch({
      type: GET_TRAINEES,
      payload: response.data,
    });
  } catch (e) {
    console.log(e);
  }
};

export const visitorChange = ({ id, value }) => {
  switch (value) {
    case 'Visitor':
      return (dispatch) => dispatch({ type: VISITOR_CHANGE, payload: id });
    case 'Absent':
      return (dispatch) => dispatch({ type: ABSENT_CHANGE, payload: id });
    case 'No':
      return (dispatch) => dispatch({ type: CHANGE_NO, payload: id });
    default:
      return null;
  }
};

export const submitVisitors = ({ id, visitors, absent }) => async () => {
  try {
    const response = await axios.patch(`/api/v1/staff_events/${id}/`, {
      visitors,
      absent,
    });
    if (response.data.id === id) {
      return true;
    }
    return false;
  } catch (e) {
    console.log(e);
    return false;
  }
};

export const writeEvent = ({ target: { name, value } }) => (dispatch) => {
  dispatch({ type: WRITE_EVENT, payload: value, target: name });
};

export const eventDate = (name, value) => (dispatch) => {
  dispatch({ type: WRITE_EVENT, payload: value, target: name });
};

export const addEvent = ({ name, date, description }) => async (dispatch) => {
  try {
    const response = await axios.post('/api/v1/staff_events/', {
      name,
      date,
      description,
      absent: [],
    });
    if (response.data.id) {
      alert('Sikeres mentés!');
      dispatch({
        type: ADD_EVENT,
        payload: response.data,
      });
    } else {
      alert('Mentés nem sikerült!');
    }
  } catch (e) {
    console.log(e);
  }
};

export const deleteEvent = (event) => async (dispatch) => {
  try {
    const response = await axios.delete(`/api/v1/staff_events/${event.id}/`);
    if (!response.data.id) {
      alert('Sikeres törlés!');
      dispatch({
        type: DELETE_EVENT,
        payload: event,
      });
    } else {
      alert('A törlés nem sikerült!');
    }
  } catch (e) {
    console.log(e);
  }
};

export const getProfiles = () => async (dispatch) => {
  try {
    const response = await axios.get('/api/v1/profiles/');
    dispatch({
      type: GET_PROFILES,
      payload: response.data,
    });
  } catch (e) {
    console.log(e);
  }
};

export const setStatus = (id, status) => async (dispatch) => {
  try {
    const response = await axios.patch(`/api/v1/profiles/${id}/`, {
      role: status,
    });
    if (response.data.id) {
      dispatch({
        type: SET_STATUS,
        payload: response.data,
      });
    }
  } catch (e) {
    console.log(e);
  }
};

export const getSelectedProfile = (id) => async (dispatch) => {
  try {
    const response = await axios.get(`/api/v1/profiles/${id}/`);
    dispatch({
      type: GET_SELECTED_PROFILE,
      payload: response.data,
    });
  } catch (e) {
    console.log(e);
  }
};