// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/// FirestoreService is implemented by FirestoreServiceImpl, for production
/// use, and by FirestoreServiceMock, for testing.
/// The implementation must be in a separate file, so that testing can
/// run on Dart native, not just on the nodeJS platform.
abstract class FirestoreService {
  Future<bool> hasPatchset(String review, String patchset);

  Future<Map<String, dynamic>> getCommit(String hash);

  Future<Map<String, dynamic>> getLastCommit();

  Future<void> addCommit(String id, Map<String, dynamic> data);

  Future<void> updateConfiguration(String configuration, String builder);

  Future<void> updateBuildInfo(String builder, int buildNumber, int index);

  Future<String> findResult(
      Map<String, dynamic> change, int startIndex, int endIndex);

  Future<void> storeResult(
      Map<String, dynamic> change, int startIndex, int endIndex,
      {bool approved = false});

  Future<bool> updateResult(
      String result, String configuration, int startIndex, int endIndex);

  Future<bool> storeTryChange(
      Map<String, dynamic> change, int review, int patchset);

  Future<void> storeReview(String review, Map<String, dynamic> data);
  Future<void> storePatchset(
      String review, int patchset, Map<String, dynamic> data);

  Future<bool> reviewIsLanded(int review);

  Future<void> linkReviewToCommit(int review, int index);

  Future<void> linkCommentsToCommit(int review, int index);

  Future<List<Map<String, dynamic>>> tryApprovals(int review);

  Future<void> storeChunkStatus(String builder, int index, bool success);

  Future<void> storeBuildChunkCount(String builder, int index, int numChunks);

  Future<void> storeTryChunkStatus(
      String builder, int review, int patchset, bool success);

  Future<void> storeTryBuildChunkCount(
      String builder, int review, int patchset, int numChunks);
}
