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

#ifndef CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_FAKE_DRIVE_SERVICE_HELPER_H_
#define CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_FAKE_DRIVE_SERVICE_HELPER_H_

#include <string>

#include "base/files/scoped_temp_dir.h"
#include "chrome/browser/drive/drive_uploader.h"
#include "chrome/browser/drive/fake_drive_service.h"
#include "chrome/browser/google_apis/gdata_wapi_parser.h"

namespace base {
class FilePath;
}

namespace sync_file_system {
namespace drive_backend {

class FakeDriveServiceHelper {
 public:
  FakeDriveServiceHelper(drive::FakeDriveService* fake_drive_service,
                         drive::DriveUploaderInterface* drive_uploader);
  virtual ~FakeDriveServiceHelper();

  google_apis::GDataErrorCode AddOrphanedFolder(
      const std::string& title,
      std::string* folder_id);
  google_apis::GDataErrorCode AddFolder(
      const std::string& parent_folder_id,
      const std::string& title,
      std::string* folder_id);
  google_apis::GDataErrorCode AddFile(
      const std::string& parent_folder_id,
      const std::string& title,
      const std::string& content,
      std::string* file_id);
  google_apis::GDataErrorCode UpdateFile(
      const std::string& file_id,
      const std::string& content);
  google_apis::GDataErrorCode RemoveResource(
      const std::string& file_id);
  google_apis::GDataErrorCode GetSyncRootFolderID(
      std::string* sync_root_folder_id);
  google_apis::GDataErrorCode ListFilesInFolder(
      const std::string& folder_id,
      ScopedVector<google_apis::ResourceEntry>* entries);
  google_apis::GDataErrorCode SearchByTitle(
      const std::string& folder_id,
      const std::string& title,
      ScopedVector<google_apis::ResourceEntry>* entries);
  google_apis::GDataErrorCode GetResourceEntry(
      const std::string& file_id,
      scoped_ptr<google_apis::ResourceEntry>* entry);
  google_apis::GDataErrorCode ReadFile(
      const std::string& file_id,
      std::string* file_content);
  google_apis::GDataErrorCode GetAboutResource(
      scoped_ptr<google_apis::AboutResource>* about_resource);

  base::FilePath base_dir_path() { return base_dir_.path(); }

 private:
  google_apis::GDataErrorCode CompleteListing(
      scoped_ptr<google_apis::ResourceList> list,
      ScopedVector<google_apis::ResourceEntry> * entries);

  void Initialize();

  base::FilePath WriteToTempFile(const std::string& content);

  base::ScopedTempDir base_dir_;
  base::FilePath temp_dir_;

  // Not own.
  drive::FakeDriveService* fake_drive_service_;
  drive::DriveUploaderInterface* drive_uploader_;
};

}  // namespace drive_backend
}  // namespace sync_file_system

#endif  // CHROME_BROWSER_SYNC_FILE_SYSTEM_DRIVE_BACKEND_V1_FAKE_DRIVE_SERVICE_HELPER_H_
