// Copyright 2021 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/foundation/github_checks_util.dart';
import 'package:cocoon_service/src/model/appengine/commit.dart';
import 'package:cocoon_service/src/model/ci_yaml/ci_yaml.dart';
import 'package:cocoon_service/src/model/proto/protos.dart' as pb;
import 'package:cocoon_service/src/service/buildbucket.dart';
import 'package:cocoon_service/src/service/cache_service.dart';
import 'package:cocoon_service/src/service/config.dart';
import 'package:cocoon_service/src/service/github_checks_service.dart';
import 'package:cocoon_service/src/service/luci_build_service.dart';
import 'package:cocoon_service/src/service/scheduler.dart';
import 'package:github/github.dart';
import 'package:retry/retry.dart';

import '../utilities/entity_generators.dart';
import 'fake_luci_build_service.dart';

/// Fake for [Scheduler] to use for tests that rely on it.
class FakeScheduler extends Scheduler {
  FakeScheduler({
    this.ciYaml,
    LuciBuildService? luciBuildService,
    BuildBucketClient? buildbucket,
    required Config config,
    GithubChecksUtil? githubChecksUtil,
  }) : super(
          cache: CacheService(inMemory: true),
          config: config,
          githubChecksService: GithubChecksService(config, githubChecksUtil: githubChecksUtil),
          luciBuildService: luciBuildService ??
              FakeLuciBuildService(config, buildbucket: buildbucket, githubChecksUtil: githubChecksUtil),
        );

  final CiYaml _defaultConfig = emptyConfig;

  /// [CiYaml] value to be injected on [getCiYaml].
  CiYaml? ciYaml;

  @override
  Future<CiYaml> getCiYaml(Commit commit, {CiYaml? totCiYaml, RetryOptions? retryOptions}) async =>
      ciYaml ?? _defaultConfig;

  @override
  Future<Commit> generateTotCommit({required String branch, required RepositorySlug slug}) async {
    return generateCommit(1);
  }
}

final CiYaml emptyConfig = CiYaml(
  branch: 'master',
  slug: RepositorySlug('flutter', 'flutter'),
  config: pb.SchedulerConfig(
    enabledBranches: <String>['master'],
    targets: <pb.Target>[
      pb.Target(
        name: 'Linux A',
        scheduler: pb.SchedulerSystem.luci,
      ),
    ],
  ),
);

CiYaml exampleConfig = CiYaml(
  slug: RepositorySlug('flutter', 'flutter'),
  branch: 'master',
  config: pb.SchedulerConfig(enabledBranches: <String>[
    'master'
  ], targets: <pb.Target>[
    pb.Target(
      name: 'Linux A',
      scheduler: pb.SchedulerSystem.luci,
    ),
    pb.Target(
      name: 'Mac A',
      scheduler: pb.SchedulerSystem.luci,
    ),
    pb.Target(
      name: 'Windows A',
      scheduler: pb.SchedulerSystem.luci,
    ),
    pb.Target(
      bringup: false,
      name: 'Google Internal Roll',
      presubmit: false,
      postsubmit: true,
      scheduler: pb.SchedulerSystem.google_internal,
    ),
  ]),
);

CiYaml batchPolicyConfig = CiYaml(
  slug: RepositorySlug('flutter', 'flutter'),
  branch: 'master',
  config: pb.SchedulerConfig(enabledBranches: <String>[
    'master'
  ], targets: <pb.Target>[
    pb.Target(
      name: 'Linux_android A',
    ),
    pb.Target(
      name: 'Linux_android B',
    ),
  ]),
);
