import { createAction } from 'redux-actions';
import i18next from 'i18next';
import apiClient from '../api/Api';
import { getClients } from './index';
import { addErrorToast, addSuccessToast } from './toasts';

export const toggleClientModal = createAction('TOGGLE_CLIENT_MODAL');

export const addClientRequest = createAction('ADD_CLIENT_REQUEST');
export const addClientFailure = createAction('ADD_CLIENT_FAILURE');
export const addClientSuccess = createAction('ADD_CLIENT_SUCCESS');

export const addClient = (config) => async (dispatch) => {
    dispatch(addClientRequest());
    try {
        await apiClient.addClient(config);
        dispatch(addClientSuccess());
        dispatch(toggleClientModal());
        dispatch(addSuccessToast(i18next.t('client_added', { key: config.name })));
        dispatch(getClients());
    } catch (error) {
        dispatch(addErrorToast({ error }));
        dispatch(addClientFailure());
    }
};

export const deleteClientRequest = createAction('DELETE_CLIENT_REQUEST');
export const deleteClientFailure = createAction('DELETE_CLIENT_FAILURE');
export const deleteClientSuccess = createAction('DELETE_CLIENT_SUCCESS');

export const deleteClient = (config) => async (dispatch) => {
    dispatch(deleteClientRequest());
    try {
        await apiClient.deleteClient(config);
        dispatch(deleteClientSuccess());
        dispatch(addSuccessToast(i18next.t('client_deleted', { key: config.name })));
        dispatch(getClients());
    } catch (error) {
        dispatch(addErrorToast({ error }));
        dispatch(deleteClientFailure());
    }
};

export const updateClientRequest = createAction('UPDATE_CLIENT_REQUEST');
export const updateClientFailure = createAction('UPDATE_CLIENT_FAILURE');
export const updateClientSuccess = createAction('UPDATE_CLIENT_SUCCESS');

export const updateClient = (config, name) => async (dispatch) => {
    dispatch(updateClientRequest());
    try {
        const data = { name, data: { ...config } };

        await apiClient.updateClient(data);
        dispatch(updateClientSuccess());
        dispatch(toggleClientModal());
        dispatch(addSuccessToast(i18next.t('client_updated', { key: name })));
        dispatch(getClients());
    } catch (error) {
        dispatch(addErrorToast({ error }));
        dispatch(updateClientFailure());
    }
};
