// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

import FauxtonAPI from "./base";
import Promise from 'bluebird';

export const authenticate = (session, roles) => {
  if (session.isAdminParty()) {
    return true;
  } else if (session.matchesRoles(roles)) {
    return true;
  }

  throw new Error('Unable to authenticate');
};

export const authenticationDenied = () => {
  let url = window.location.hash
    .replace('#', '')
    .replace('login?urlback=', '');

  if (url) {
    FauxtonAPI.navigate(`/login?urlback=${url}`, { replace: true });
  }

  FauxtonAPI.navigate(`/login`, { replace: true });
};

export const checkAccess = (roles = []) => {
  return new Promise((resolve, reject) => {
    return FauxtonAPI.session.getSession()
      .then(() => {
        if (authenticate(FauxtonAPI.session, roles)) {
          resolve();
          return;
        }

        reject();
      })
      .catch(err => {
        reject(err);
        authenticationDenied();
      });
  });
};
