// Copyright 2014 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 SYNC_API_ATTACHMENTS_ATTACHMENT_SERVICE_H_
#define SYNC_API_ATTACHMENTS_ATTACHMENT_SERVICE_H_

#include "base/basictypes.h"
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "sync/api/attachments/attachment.h"
#include "sync/base/sync_export.h"

namespace syncer {

class SyncData;

// AttachmentService is responsible for managing a model type's attachments.
//
// Outside of sync code, AttachmentService shouldn't be used directly. Instead
// use the functionality provided by SyncData and SyncChangeProcessor.
//
// Destroying this object does not necessarily cancel outstanding async
// operations. If you need cancel like semantics, use WeakPtr in the callbacks.
class SYNC_EXPORT AttachmentService {
 public:
  // The result of a GetOrDownloadAttachments operation.
  enum GetOrDownloadResult {
    GET_SUCCESS,            // No error, all attachments returned.
    GET_UNSPECIFIED_ERROR,  // An unspecified error occurred.
  };

  typedef base::Callback<
      void(const GetOrDownloadResult&, scoped_ptr<AttachmentMap> attachments)>
      GetOrDownloadCallback;

  // The result of a DropAttachments operation.
  enum DropResult {
    DROP_SUCCESS,            // No error, all attachments dropped.
    DROP_UNSPECIFIED_ERROR,  // An unspecified error occurred. Some or all
                             // attachments may not have been dropped.
  };

  typedef base::Callback<void(const DropResult&)> DropCallback;

  // The result of a StoreAttachments operation.
  enum StoreResult {
    STORE_SUCCESS,            // No error, all attachments stored (at least
                              // locally).
    STORE_UNSPECIFIED_ERROR,  // An unspecified error occurred. Some or all
                              // attachments may not have been stored.
  };

  typedef base::Callback<void(const StoreResult&)> StoreCallback;

  // An interface that embedder code implements to be notified about different
  // events that originate from AttachmentService.
  // This interface will be called from the same thread AttachmentService was
  // created and called.
  class Delegate {
   public:
    virtual ~Delegate() {}

    // Attachment is uploaded to server and attachment_id is updated with server
    // url.
    virtual void OnAttachmentUploaded(const AttachmentId& attachment_id) = 0;
  };

  AttachmentService();
  virtual ~AttachmentService();

  // See SyncData::GetOrDownloadAttachments.
  virtual void GetOrDownloadAttachments(
      const AttachmentIdList& attachment_ids,
      const GetOrDownloadCallback& callback) = 0;

  // See SyncData::DropAttachments.
  virtual void DropAttachments(const AttachmentIdList& attachment_ids,
                               const DropCallback& callback) = 0;

  // Store |attachments| on device and (eventually) upload them to the server.
  //
  // Invokes |callback| once the attachments have been written to device
  // storage.
  virtual void StoreAttachments(const AttachmentList& attachments,
                                const StoreCallback& callback) = 0;
};

}  // namespace syncer

#endif  // SYNC_API_ATTACHMENTS_ATTACHMENT_SERVICE_H_
