// Copyright (C) 2008 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gerrit.common.data;

import com.google.gerrit.common.audit.Audit;
import com.google.gerrit.common.auth.SignInRequired;
import com.google.gerrit.reviewdb.client.AccountDiffPreference;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gwtjsonrpc.common.AsyncCallback;
import com.google.gwtjsonrpc.common.RemoteJsonService;
import com.google.gwtjsonrpc.common.RpcImpl;
import com.google.gwtjsonrpc.common.RpcImpl.Version;
import com.google.gwtjsonrpc.common.VoidResult;

@RpcImpl(version = Version.V2_0)
public interface PatchDetailService extends RemoteJsonService {
  @Audit
  void patchScript(Patch.Key key, PatchSet.Id a, PatchSet.Id b,
      AccountDiffPreference diffPrefs, AsyncCallback<PatchScript> callback);

  @Audit
  @SignInRequired
  void saveDraft(PatchLineComment comment,
      AsyncCallback<PatchLineComment> callback);

  @Audit
  @SignInRequired
  void deleteDraft(PatchLineComment.Key key, AsyncCallback<VoidResult> callback);

  /**
   * Deletes the specified draft patch set. If the draft patch set is the only
   * patch set of the change, then also the change gets deleted.
   *
   * @param psid ID of the draft patch set that should be deleted
   * @param callback callback to report the result of the draft patch set
   *        deletion operation; if the draft patch set was successfully deleted
   *        {@link AsyncCallback#onSuccess(Object)} is invoked and the change
   *        details are passed as parameter; if the change gets deleted because
   *        the draft patch set that was deleted was the only patch set in the
   *        change, then <code>null</code> is passed as result to
   *        {@link AsyncCallback#onSuccess(Object)}
   */
  @Audit
  @SignInRequired
  void deleteDraftPatchSet(PatchSet.Id psid, AsyncCallback<ChangeDetail> callback);
}
