import { call, put, takeLatest } from 'redux-saga/effects';
import { AnyAction } from 'redux';

import api from '@services/api';
import {
  loadSuccess,
  loadFailure,
  loginSuccess,
  loginFailure,
  updateTokenSuccess,
  updateTokenFailure,
} from './actions';
import { UserTypes } from './types';

function* login(action: AnyAction) {
  try {
    yield put(loginSuccess(action.payload));
    api.defaults.headers.Authorization = `Bearer ${action.payload.token}`;
  } catch (err) {
    yield put(loginFailure());
  }
}

function* tokenUpdate(action: AnyAction) {
  try {
    yield put(updateTokenSuccess(action.payload));
    api.defaults.headers.Authorization = `Bearer ${action.payload}`;
  } catch (err) {
    yield put(updateTokenFailure());
  }
}

function* load(action: AnyAction) {
  const { parameters } = action.payload;
  try {
    const response: { [key: string]: any } = yield call(api.get, 'auth/user', {
      params: parameters,
    });
    yield put(loadSuccess(response.data));
  } catch (err) {
    yield put(loadFailure());
  }
}

const userSagas = [
  takeLatest(UserTypes.LOAD_REQUEST, load),
  takeLatest(UserTypes.TOKEN_UPDATE, tokenUpdate),
  takeLatest(UserTypes.LOGIN_REQUEST, login),
];

export default userSagas;