// 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 'package:googleapis/pubsub/v1.dart' as pubsub;
import 'package:googleapis_auth/auth_io.dart';
import 'package:http/http.dart';

import '../foundation/providers.dart';
import '../foundation/typedefs.dart';
import '../service/log.dart';

/// Service class for interacting with PubSub.
class PubSub {
  const PubSub({
    this.httpClientProvider = Providers.freshHttpClient,
  });

  final HttpClientProvider httpClientProvider;

  /// Adds one message to the topic.
  Future<void> publish(String topic, dynamic json) async {
    final Client httpClient = await clientViaApplicationDefaultCredentials(scopes: <String>[
      pubsub.PubsubApi.pubsubScope,
    ]);
    final pubsub.PubsubApi pubsubApi = pubsub.PubsubApi(httpClient);
    final String messageData = jsonEncode(json);
    final List<int> messageBytes = utf8.encode(messageData);
    final String messageBase64 = base64Encode(messageBytes);
    final pubsub.PublishRequest request = pubsub.PublishRequest(messages: <pubsub.PubsubMessage>[
      pubsub.PubsubMessage(data: messageBase64),
    ]);
    final String fullTopicName = 'projects/flutter-dashboard/topics/$topic';
    final pubsub.PublishResponse response = await pubsubApi.projects.topics.publish(request, fullTopicName);
    log.info('pubsub response messageId=${response.messageIds}');
  }

  /// Pulls messages from the server.
  Future<pubsub.PullResponse> pull(String subscription, int maxMessages) async {
    final Client httpClient = await clientViaApplicationDefaultCredentials(scopes: <String>[
      pubsub.PubsubApi.pubsubScope,
    ]);
    final pubsub.PubsubApi pubsubApi = pubsub.PubsubApi(httpClient);
    pubsub.PullRequest pullRequest = pubsub.PullRequest(maxMessages: maxMessages);
    final pubsub.PullResponse pullResponse = await pubsubApi.projects.subscriptions
        .pull(pullRequest, 'projects/flutter-dashboard/subscriptions/$subscription');
    return pullResponse;
  }

  /// Acknowledges the messages associated with the `ack_ids` in the `AcknowledgeRequest`.
  ///
  /// The PubSub system can remove the relevant messages from the subscription.
  Future<void> acknowledge(String subscription, String ackId) async {
    final Client httpClient = await clientViaApplicationDefaultCredentials(scopes: <String>[
      pubsub.PubsubApi.pubsubScope,
    ]);
    final pubsub.PubsubApi pubsubApi = pubsub.PubsubApi(httpClient);
    final List<String> ackIds = [ackId];
    final pubsub.AcknowledgeRequest acknowledgeRequest = pubsub.AcknowledgeRequest(ackIds: ackIds);
    await pubsubApi.projects.subscriptions
        .acknowledge(acknowledgeRequest, 'projects/flutter-dashboard/subscriptions/$subscription');
  }
}
