// 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.

const Crostini = {};

/**
 * Set from cmd line flag 'crostini-files'.
 * @type {boolean}
 */
Crostini.IS_CROSTINI_FILES_ENABLED = false;

/**
 * Maintains a list of paths shared with the crostini container.
 * Keyed by VolumeManagerCommon.RootType, with boolean set values
 * of string paths.  e.g. {'Downloads': {'/foo': true, '/bar': true}}.
 * @private @dict {!Object<!Object<boolean>>}
 */
Crostini.SHARED_PATHS_ = {};

/**
 * Registers an entry as a shared path.
 * @param {!Entry} entry
 * @param {!VolumeManager} volumeManager
 */
Crostini.registerSharedPath = function(entry, volumeManager) {
  const info = volumeManager.getLocationInfo(entry);
  if (!info)
    return;
  let paths = Crostini.SHARED_PATHS_[info.rootType];
  if (!paths) {
    paths = {};
    Crostini.SHARED_PATHS_[info.rootType] = paths;
  }
  paths[entry.fullPath] = true;
};

/**
 * Unregisters entry as a shared path.
 * @param {!Entry} entry
 * @param {!VolumeManager} volumeManager
 */
Crostini.unregisterSharedPath = function(entry, volumeManager) {
  const info = volumeManager.getLocationInfo(entry);
  if (!info)
    return;
  const paths = Crostini.SHARED_PATHS_[info.rootType];
  if (paths) {
    delete paths[entry.fullPath];
  }
};

/**
 * Returns true if entry is shared.
 * @param {!Entry} entry
 * @param {!VolumeManager} volumeManager
 * @return {boolean} True if path is shared either by a direct
 * share or from one of its ancestor directories.
 */
Crostini.isPathShared = function(entry, volumeManager) {
  const root = volumeManager.getLocationInfo(entry).rootType;
  const paths = Crostini.SHARED_PATHS_[root];
  if (!paths)
    return false;
  // Check path and all ancestor directories.
  let path = entry.fullPath;
  while (path != '') {
    if (paths[path])
      return true;
    path = path.substring(0, path.lastIndexOf('/'));
  }
  return false;
};

/**
 * @param {!Entry} entry
 * @param {!VolumeManager} volumeManager
 * @return {boolean} True if the entry is from crostini.
 */
Crostini.isCrostiniEntry = function(entry, volumeManager) {
  return volumeManager.getLocationInfo(entry).rootType ===
      VolumeManagerCommon.RootType.CROSTINI;
};

/**
 * Returns true if entry can be shared with Crostini.
 * @param {!Entry} entry
 * @param {!VolumeManager} volumeManager
 */
Crostini.canSharePath = function(entry, volumeManager) {
  // Do not allow root, or non-directories in root.
  return Crostini.IS_CROSTINI_FILES_ENABLED && entry.fullPath !== '/' &&
      (entry.isDirectory || entry.fullPath.split('/').length > 2) &&
      volumeManager.getLocationInfo(entry).rootType ===
      VolumeManagerCommon.RootType.DOWNLOADS;
};
