import { all, call, fork, put, takeEvery } from 'redux-saga/effects';
import { ApiService } from '@/shared';
import * as actionTypes from './types.js';

export const sendGroups = (id, groups) => ({
  type: actionTypes.SEND_GROUPS,
  payload: { 
    id,
    groups 
  },
});

export const sendStudents = (id, students) => ({
  type: actionTypes.SEND_STUDENTS,
  payload: {
    id,
    students
  },
});

export const sendThemes = (themes) => ({
  type: actionTypes.SEND_THEMES,
  payload: { themes },
});

export function* sendGroupsWatcher() {
  yield takeEvery(actionTypes.SEND_GROUPS, sendGroupsWorker);
}

export function* sendStudentsWatcher() {
  yield takeEvery(actionTypes.SEND_STUDENTS, sendStudentsWorker);
}

export function* sendThemesWatcher() {
  yield takeEvery(actionTypes.SEND_THEMES, sendThemesWorker);
}

function* sendGroupsWorker(data) {
  try {
    yield put({ type: actionTypes.SENDING_GROUPS_STARTED });
    const courseId = data.payload.id;
    const groupsFile = data.payload.groups;
    const groups = yield call(ApiService.create, `/imports/groups/${courseId}`, groupsFile);
    yield put({ type: actionTypes.SENDING_GROUPS_SUCCESS, payload: { groups } });
    yield put({ type: actionTypes.CLEAR_LOADED });
  } catch (error) {
    yield put({ type: actionTypes.SENDING_GROUPS_FAILED, payload: { error } });
  }
}

function* sendStudentsWorker(data) {
  try {
    yield put({ type: actionTypes.SENDING_STUDENTS_STARTED });
    const students = yield call(ApiService.create, `/imports/students/${data.payload.id}`, data.payload.students);
    yield put({ type: actionTypes.SENDING_STUDENTS_SUCCESS, payload: { students } });
    yield put({ type: actionTypes.CLEAR_LOADED });
  } catch (error) {
    yield put({ type: actionTypes.SENDING_STUDENTS_FAILED, payload: { error } });
  }
}

function* sendThemesWorker(data) {
  try {
    yield put({ type: actionTypes.SENDING_THEMES_STARTED });
    const themes = yield call(ApiService.create, '/imports/themes', data.payload.themes);
    yield put({ type: actionTypes.SENDING_THEMES_SUCCESS, payload: { themes } });
    yield put({ type: actionTypes.CLEAR_LOADED });
  } catch (error) {
    yield put({ type: actionTypes.SENDING_THEMES_FAILED, payload: { error } });
  }
}

export function* importWatcher() {
  yield all([
    fork(sendGroupsWatcher),
    fork(sendStudentsWatcher),
    fork(sendThemesWatcher),
  ]);
}