// 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 'package:cocoon_service/src/model/luci/buildbucket.dart';
import 'package:cocoon_service/src/service/buildbucket.dart';
import 'package:http/http.dart' as http;
import 'package:http/testing.dart';

/// Fake [BuildBucketClient] for handling requests to BuildBucket.
///
/// By default, returns good responses but can be updated to throw exceptions.
// ignore: must_be_immutable
class FakeBuildBucketClient extends BuildBucketClient {
  FakeBuildBucketClient({
    this.scheduleBuildResponse,
    this.searchBuildsResponse,
    this.batchResponse,
    this.cancelBuildResponse,
    this.getBuildResponse,
    this.listBuildersResponse,
  }) : super(httpClient: MockClient((_) async => http.Response('', 200)));

  Future<Build>? scheduleBuildResponse;
  Future<SearchBuildsResponse>? searchBuildsResponse;
  Future<BatchResponse> Function()? batchResponse;
  Future<Build>? cancelBuildResponse;
  Future<Build>? getBuildResponse;
  Future<ListBuildersResponse>? listBuildersResponse;

  @override
  Future<Build> scheduleBuild(
    ScheduleBuildRequest? request, {
    String buildBucketUri = 'https://localhost/builds',
  }) async =>
      (scheduleBuildResponse != null)
          ? await scheduleBuildResponse!
          : Build(
              id: '123',
              builderId: request!.builderId,
              tags: request.tags,
            );

  @override
  Future<SearchBuildsResponse> searchBuilds(
    SearchBuildsRequest? request, {
    String buildBucketUri = 'https://localhost/builds',
  }) async =>
      (searchBuildsResponse != null)
          ? await searchBuildsResponse!
          : const SearchBuildsResponse(
              builds: <Build>[
                Build(
                  id: '123',
                  builderId: BuilderId(
                    builder: 'builder_abc',
                    bucket: 'try',
                    project: 'flutter',
                  ),
                  tags: <String, List<String>>{
                    'buildset': <String>['pr/git/12345', 'sha/git/259bcf77bd04e64ef2181caccc43eda57780cd21'],
                    'cipd_version': <String>['refs/heads/main']
                  },
                  input: Input(
                    properties: <String, dynamic>{'bringup': 'true'},
                  ),
                ),
              ],
            );

  @override
  Future<BatchResponse> batch(
    BatchRequest request, {
    String buildBucketUri = 'https://localhost/builds',
  }) async {
    if (batchResponse != null) {
      return batchResponse!();
    }
    final List<Response> responses = <Response>[];
    for (Request request in request.requests!) {
      if (request.cancelBuild != null) {
        responses.add(Response(cancelBuild: await cancelBuild(request.cancelBuild)));
      } else if (request.getBuild != null) {
        responses.add(Response(getBuild: await getBuild(request.getBuild)));
      } else if (request.scheduleBuild != null) {
        responses.add(Response(scheduleBuild: await scheduleBuild(request.scheduleBuild)));
      } else if (request.searchBuilds != null) {
        responses.add(Response(searchBuilds: await searchBuilds(request.searchBuilds)));
      }
    }
    return BatchResponse(responses: responses);
  }

  @override
  Future<Build> cancelBuild(
    CancelBuildRequest? request, {
    String buildBucketUri = 'https://localhost/builds',
  }) async =>
      (cancelBuildResponse != null)
          ? await cancelBuildResponse!
          : Build(
              id: request!.id,
              builderId: const BuilderId(
                bucket: 'try',
                project: 'flutter',
                builder: 'builder_abc',
              ),
              summaryMarkdown: request.summaryMarkdown);

  @override
  Future<Build> getBuild(
    GetBuildRequest? request, {
    String buildBucketUri = 'https://localhost/builds',
  }) async =>
      (getBuildResponse != null)
          ? await getBuildResponse!
          : Build(
              id: request!.id!,
              builderId: request.builderId!,
              number: request.buildNumber,
            );

  @override
  Future<ListBuildersResponse> listBuilders(
    ListBuildersRequest? request, {
    String buildBucketUri = 'https://localhost/builders',
  }) async =>
      (listBuildersResponse != null)
          ? await listBuildersResponse!
          : const ListBuildersResponse(builders: <BuilderItem>[
              BuilderItem(
                id: BuilderId(
                  bucket: 'prod',
                  project: 'flutter',
                  builder: 'Linux_android A',
                ),
              ),
              BuilderItem(
                id: BuilderId(
                  bucket: 'prod',
                  project: 'flutter',
                  builder: 'Linux_android B',
                ),
              )
            ]);
}
