// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview Utility functions for the App Management page.
 */

cr.define('app_management.util', function() {
  /**
   * @return {!AppManagementPageState}
   */
  function createEmptyState() {
    return {
      apps: {},
      currentPage: {
        pageType: PageType.MAIN,
        selectedAppId: null,
      },
      search: {
        term: null,
        results: null,
      },
    };
  }

  /**
   * @param {!Array<App>} apps
   * @return {!AppManagementPageState}
   */
  function createInitialState(apps) {
    const initialState = createEmptyState();

    for (const app of apps) {
      initialState.apps[app.id] = app;
    }

    return initialState;
  }

  /**
   * @param {number} permissionId
   * @param {!PermissionValueType} valueType
   * @param {number} value
   * @return {!Permission}
   */
  function createPermission(permissionId, valueType, value) {
    return {
      permissionId: permissionId,
      valueType: valueType,
      value: value,
    };
  }

  /**
   * @param {App} app
   * @return {string}
   */
  function getAppIcon(app) {
    return `chrome://app-icon/${app.id}/128`;
  }

  /**
   * Returns true if the current page is notification view.
   * @param {AppManagementPageState} state
   * @return {boolean}
   */
  function isNotificationsViewSelected(state) {
    return state.currentPage.pageType === PageType.NOTIFICATIONS;
  }

  /**
   * @return {!Array<Array<App>>}
   */
  function splitByNotificationPermission() {
    const apps = Object.values(app_management.Store.getInstance().data.apps);
    const notificationsAllowed = [];
    const notificationsBlocked = [];
    for (const app of apps) {
      // Chrome app's notification permission cannot be changed and therefore
      // are not included in notification view
      if (app.type === AppType.kExtension) {
        continue;
      }
      // TODO(rekanorman) Branch on different app type in the future.
      if (getPermissionValueBool(app, 'CONTENT_SETTINGS_TYPE_NOTIFICATIONS')) {
        notificationsAllowed.push(app);
      } else {
        notificationsBlocked.push(app);
      }
    }
    return [notificationsAllowed, notificationsBlocked];
  }

  /**
   * @param {App} app
   * @param {string} permissionType
   * @return {boolean}
   */
  function getPermissionValueBool(app, permissionType) {
    if (getPermissionValueType(app) === PermissionValueType.kBool &&
        getPermissionValue(app, permissionType) === Bool.kTrue) {
      return true;
    }
    if (getPermissionValueType(app) === PermissionValueType.kTriState &&
        getPermissionValue(app, permissionType) === TriState.kAllow) {
      return true;
    }
    return false;
  }

  /**
   * @param {App} app
   * @return {number}
   * @private
   */
  function getPermissionValueType(app) {
    // TODO(rekanorman): Change to a suitable conditional statement once the
    // PermissionValueType corresponding to each AppType is known.
    return PermissionValueType.kTriState;
  }


  /**
   * @param {App} app
   * @param {string} permissionType
   * @return {?number}
   * @private
   */
  function getPermissionValue(app, permissionType) {
    if (!app) {
      return null;
    }

    // TODO(rekanorman): Remove once permissions are implemented for all
    // app types.
    if (Object.keys(app.permissions).length === 0) {
      return null;
    }

    // TODO(rekanorman): Make generic once permissions are implemented for
    // other app types.
    return /** @type Object<number, Permission> */ (
               app.permissions)[PwaPermissionType[permissionType]]
        .value;
  }

  /**
   * If there is no selected app, returns undefined so that Polymer bindings
   * won't be updated.
   * @param {AppManagementPageState} state
   * @return {App|undefined}
   */
  function getSelectedApp(state) {
    const selectedAppId = state.currentPage.selectedAppId;
    if (selectedAppId) {
      return state.apps[selectedAppId];
    }
  }

  return {
    createEmptyState: createEmptyState,
    createInitialState: createInitialState,
    createPermission: createPermission,
    getAppIcon: getAppIcon,
    getPermissionValue: getPermissionValue,
    getPermissionValueBool: getPermissionValueBool,
    getPermissionValueType: getPermissionValueType,
    getSelectedApp: getSelectedApp,
    isNotificationsViewSelected: isNotificationsViewSelected,
    splitByNotificationPermission: splitByNotificationPermission,
  };
});
