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

export default class PlatformFileSystem {
  /**
   * @param {string} path
   * @param {string} type
   */
  constructor(path, type) {
    this._path = path;
    this._type = type;
  }

  /**
   * @param {string} path
   * @return {!Promise<?{modificationTime: !Date, size: number}>}
   */
  getMetadata(path) {
    return Promise.resolve(/** @type ?{modificationTime: !Date, size: number} */ (null));
  }

  /**
   * @return {!Array<string>}
   */
  initialFilePaths() {
    return [];
  }

  /**
   * @return {!Array<string>}
   */
  initialGitFolders() {
    return [];
  }

  /**
   * @return {string}
   */
  path() {
    return this._path;
  }

  /**
   * @return {string}
   */
  embedderPath() {
    throw new Error('Not implemented');
  }

  /**
   * @return {string}
   */
  type() {
    // TODO(kozyatinskiy): remove type, overrides should implement this interface.
    return this._type;
  }

  /**
   * @param {string} path
   * @param {?string} name
   * @return {!Promise<?string>}
   */
  async createFile(path, name) {
    return Promise.resolve(null);
  }

  /**
   * @param {string} path
   * @return {!Promise<boolean>}
   */
  deleteFile(path) {
    return Promise.resolve(false);
  }

  /**
   * @param {string} path
   * @return {!Promise<?Blob>}
   */
  requestFileBlob(path) {
    return Promise.resolve(/** @type {?Blob} */ (null));
  }

  /**
   * @param {string} path
   * @returns {!Promise<!Common.DeferredContent>}
   */
  async requestFileContent(path) {
    return {error: ls`Unable to read files with this implementation.`, isEncoded: false};
  }

  /**
   * @param {string} path
   * @param {string} content
   * @param {boolean} isBase64
   */
  setFileContent(path, content, isBase64) {
    throw new Error('Not implemented');
  }

  /**
   * @param {string} path
   * @param {string} newName
   * @param {function(boolean, string=)} callback
   */
  renameFile(path, newName, callback) {
    callback(false);
  }

  /**
   * @param {string} path
   */
  addExcludedFolder(path) {
  }

  /**
   * @param {string} path
   */
  removeExcludedFolder(path) {
  }

  fileSystemRemoved() {
  }

  /**
   * @param {string} folderPath
   * @return {boolean}
   */
  isFileExcluded(folderPath) {
    return false;
  }

  /**
   * @return {!Set<string>}
   */
  excludedFolders() {
    return new Set();
  }

  /**
   * @param {string} query
   * @param {!Common.Progress} progress
   * @return {!Promise<!Array<string>>}
   */
  searchInPath(query, progress) {
    return Promise.resolve([]);
  }

  /**
   * @param {!Common.Progress} progress
   */
  indexContent(progress) {
    setImmediate(() => progress.done());
  }

  /**
   * @param {string} path
   * @return {string}
   */
  mimeFromPath(path) {
    throw new Error('Not implemented');
  }

  /**
   * @param {string} path
   * @return {boolean}
   */
  canExcludeFolder(path) {
    return false;
  }

  /**
   * @param {string} path
   * @return {!Common.ResourceType}
   */
  contentType(path) {
    throw new Error('Not implemented');
  }

  /**
   * @param {string} url
   * @return {string}
   */
  tooltipForURL(url) {
    throw new Error('Not implemented');
  }

  /**
   * @return {boolean}
   */
  supportsAutomapping() {
    throw new Error('Not implemented');
  }
}

/* Legacy exported object */
self.Persistence = self.Persistence || {};

/* Legacy exported object */
Persistence = Persistence || {};

/** @constructor */
Persistence.PlatformFileSystem = PlatformFileSystem;
