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

#include "chrome/browser/sync_file_system/drive_backend/uninstall_app_task.h"

#include "base/bind.h"
#include "base/location.h"
#include "chrome/browser/drive/drive_api_util.h"
#include "chrome/browser/drive/drive_service_interface.h"
#include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
#include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h"
#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
#include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h"
#include "chrome/browser/sync_file_system/drive_backend/tracker_id_set.h"
#include "chrome/browser/sync_file_system/syncable_file_system_util.h"
#include "google_apis/drive/drive_api_parser.h"
#include "google_apis/drive/gdata_wapi_parser.h"

namespace sync_file_system {
namespace drive_backend {

UninstallAppTask::UninstallAppTask(SyncEngineContext* sync_context,
                                   const std::string& app_id,
                                   UninstallFlag uninstall_flag)
    : sync_context_(sync_context),
      app_id_(app_id),
      uninstall_flag_(uninstall_flag),
      app_root_tracker_id_(0),
      weak_ptr_factory_(this) {
}

UninstallAppTask::~UninstallAppTask() {
}

void UninstallAppTask::RunExclusive(const SyncStatusCallback& callback) {
  if (!IsContextReady()) {
    callback.Run(SYNC_STATUS_FAILED);
    return;
  }

  if (uninstall_flag_ == RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE) {
    metadata_database()->UnregisterApp(app_id_, callback);
    return;
  }
  DCHECK_EQ(RemoteFileSyncService::UNINSTALL_AND_PURGE_REMOTE, uninstall_flag_);

  int64 sync_root_tracker_id = metadata_database()->GetSyncRootTrackerID();
  TrackerIDSet trackers;
  if (!metadata_database()->FindTrackersByParentAndTitle(
          sync_root_tracker_id, app_id_, &trackers) ||
      !trackers.has_active()) {
    callback.Run(SYNC_STATUS_OK);
    return;
  }

  FileTracker app_root_tracker;
  if (!metadata_database()->FindTrackerByTrackerID(
          trackers.active_tracker(), &app_root_tracker)) {
    NOTREACHED();
    callback.Run(SYNC_STATUS_FAILED);
    return;
  }
  app_root_tracker_id_ = app_root_tracker.tracker_id();
  DCHECK(app_root_tracker.has_synced_details());

  drive_service()->DeleteResource(
      app_root_tracker.file_id(),
      std::string(),  // etag
      base::Bind(&UninstallAppTask::DidDeleteAppRoot,
                 weak_ptr_factory_.GetWeakPtr(),
                 callback,
                 metadata_database()->GetLargestKnownChangeID()));
}

void UninstallAppTask::DidDeleteAppRoot(const SyncStatusCallback& callback,
                                        int64 change_id,
                                        google_apis::GDataErrorCode error) {
  SyncStatusCode status = GDataErrorCodeToSyncStatusCode(error);
  if (status != SYNC_STATUS_OK &&
      error != google_apis::HTTP_NOT_FOUND) {
    callback.Run(SYNC_STATUS_FAILED);
    return;
  }

  metadata_database()->UnregisterApp(app_id_, callback);
}

bool UninstallAppTask::IsContextReady() {
  return sync_context_->GetMetadataDatabase() &&
      sync_context_->GetDriveService();
}

MetadataDatabase* UninstallAppTask::metadata_database() {
  return sync_context_->GetMetadataDatabase();
}

drive::DriveServiceInterface* UninstallAppTask::drive_service() {
  set_used_network(true);
  return sync_context_->GetDriveService();
}

}  // namespace drive_backend
}  // namespace sync_file_system
