// 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',
                  ),
                )
              ],
            );
}
