// 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/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 super.config,
    GithubChecksUtil? githubChecksUtil,
  }) : super(
          cache: CacheService(inMemory: true),
          githubChecksService: GithubChecksService(
            config,
            githubChecksUtil: githubChecksUtil,
          ),
          luciBuildService: luciBuildService ??
              FakeLuciBuildService(
                config: 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',
    ),
  ]),
);
