import { backEndURL } from "../utils";

const authProvider = {
    login: ({ username, password }) =>  {

        const request = new Request(backEndURL() + '/login', {
                method: 'POST',
            body: JSON.stringify({ username, password }),
            headers: new Headers({ 'Content-Type': 'application/json' }),
        });
        return fetch(request, { credentials: 'include'})
            .then(response => {
                if (response.status < 200 || response.status >= 300) {
                    throw new Error(response.statusText);
                }
                return response.json();
            })
            .then( json => {
                const auth = { id: json.user.identifier, token: json.token};
                const permissions = { role: json.user.role, appName: json.app.name, isDefaultApp: json.app.isDefault}
                sessionStorage.setItem('arolios_auth', JSON.stringify(auth));
                sessionStorage.setItem('arolios_permissions', JSON.stringify(permissions));
                sessionStorage.setItem('arolios_default_language', json.app.defaultLanguage) ;
            })
            .catch(() => {
                throw new Error('Network error')
            });
    },
    logout: () => {
        sessionStorage.removeItem('arolios_auth'); 
        sessionStorage.removeItem('arolios_permissions');
        sessionStorage.removeItem('arolios_default_language');
        // try to clear the server side
        const request = new Request(backEndURL() + '/logout', {
                method: 'POST',            
        });

        return fetch(request, { credentials: 'include'})
        .then(response => {
            if (response.status < 200 || response.status >= 300) {
                throw new Error(response.statusText);
            }
            return Promise.resolve();
        })
        .catch(() => {
            throw new Error('Network error')
        });
    },
    checkAuth: () => sessionStorage.getItem('arolios_auth')
        ? Promise.resolve()
        : Promise.reject(),
    checkError:  (error) => {
      if (!error) {
        return Promise.reject(new Error ('not known error'));
      }
        const status = error.status;
        if (status === 401 || status === 403) {
            sessionStorage.removeItem('arolios_auth');
            sessionStorage.removeItem('arolios_permissions');
            sessionStorage.removeItem('arolios_default_language');
            return Promise.reject( new Error ('Authentication error'));
        }
        // other error code (404, 500, etc): no need to log out
        return Promise.resolve();
    },
    getIdentity: () => {
        try {
            const { id, identifier } = JSON.parse(sessionStorage.getItem('arolios_auth'));
            return Promise.resolve({ id, fullName: identifier });
        } catch (error) {
            return Promise.reject(error);
        }
    },
    getPermissions: () => {
        const permissions = JSON.parse(sessionStorage.getItem('arolios_permissions'));
        return (permissions) ? Promise.resolve (permissions) : Promise.reject();

       
    },

    canEdit: (role) => {
        return role === 'admin' || role === 'producer' ;
    }
};

export default authProvider;