// Copyright 2019 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:convert';
import 'dart:math';

import 'package:auto_submit/request_handling/pubsub.dart';
import 'package:googleapis/pubsub/v1.dart';

class FakePubSub extends PubSub {
  List<dynamic> messagesQueue = <dynamic>[];
  // Number of messages in each Pub/Sub pull call. This mocks the API
  // returning random number of messages each time.
  int messageSize = 2;

  @override
  Future<void> publish(String topicName, dynamic json) async {
    final String messageData = jsonEncode(json);
    final List<int> messageBytes = utf8.encode(messageData);
    final String messageBase64 = base64Encode(messageBytes);
    messagesQueue.add(messageBase64);
  }

  @override
  Future<PullResponse> pull(String subscription, int maxMessages) async {
    // The list will be empty if there are no more messages available in the backlog.
    List<ReceivedMessage> receivedMessages = <ReceivedMessage>[];
    if (messagesQueue.isNotEmpty) {
      int i = 0;
      // Returns only allowed max number of messages. The number should not be greater than
      // `maxMessages`, the available messages, and the number allowed in each call. The
      // last number is to mock real `pull` API call.
      while (i < min(min(maxMessages, messagesQueue.length), messageSize)) {
        receivedMessages.add(ReceivedMessage(message: PubsubMessage(data: messagesQueue[i] as String), ackId: '1'));
        i++;
      }
      return PullResponse(receivedMessages: receivedMessages);
    }
    return PullResponse(receivedMessages: receivedMessages);
  }

  @override
  Future<void> acknowledge(String subscription, String ackId) async {
    if (messagesQueue.isNotEmpty) {
      messagesQueue.removeAt(messagesQueue.length - 1);
    }
  }
}
