// 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:io';
import 'dart:math';

import 'package:appengine/appengine.dart';
import 'package:cocoon_service/cocoon_service.dart';
import 'package:gcloud/db.dart';

/// For local development, you might want to set this to true.
const String _kCocoonUseInMemoryCache = 'COCOON_USE_IN_MEMORY_CACHE';

Future<void> main() async {
  await withAppEngineServices(() async {
    useLoggingPackageAdaptor();

    final bool inMemoryCache = Platform.environment[_kCocoonUseInMemoryCache] == 'true';
    final CacheService cache = CacheService(inMemory: inMemoryCache);

    final Config config = Config(dbService, cache);
    final AuthenticationProvider authProvider = AuthenticationProvider(config: config);
    final AuthenticationProvider swarmingAuthProvider = SwarmingAuthenticationProvider(config: config);
    final BuildBucketClient buildBucketClient = BuildBucketClient(
      accessTokenService: AccessTokenService.defaultProvider(config),
    );

    /// LUCI service class to communicate with buildBucket service.
    final LuciBuildService luciBuildService = LuciBuildService(
      config: config,
      buildBucketClient: buildBucketClient,
      pubsub: const PubSub(),
    );

    /// Github checks api service used to provide luci test execution status on the Github UI.
    final GithubChecksService githubChecksService = GithubChecksService(
      config,
    );

    /// Cocoon scheduler service to manage validating commits in presubmit and postsubmit.
    final Scheduler scheduler = Scheduler(
      cache: cache,
      config: config,
      githubChecksService: githubChecksService,
      luciBuildService: luciBuildService,
    );

    final BranchService branchService = BranchService(
      config: config,
      gerritService: GerritService(),
    );

    final Map<String, RequestHandler<dynamic>> handlers = <String, RequestHandler<dynamic>>{
      '/api/check_flaky_builders': CheckFlakyBuilders(
        config: config,
        authenticationProvider: authProvider,
      ),
      '/api/create-branch': CreateBranch(
        branchService: branchService,
        config: config,
        authenticationProvider: authProvider,
      ),
      '/api/file_flaky_issue_and_pr': FileFlakyIssueAndPR(
        config: config,
        authenticationProvider: authProvider,
      ),
      '/api/flush-cache': FlushCache(
        config: config,
        authenticationProvider: authProvider,
        cache: cache,
      ),
      '/api/get-authentication-status': GetAuthenticationStatus(
        config: config,
        authenticationProvider: authProvider,
      ),
      '/api/github-webhook-pullrequest': GithubWebhook(
        config: config,
        pubsub: const PubSub(),
      ),
      '/api/github/webhook-branch-subscription': GithubBranchWebhookSubscription(
        config: config,
        cache: cache,
        branchService: branchService,
      ),
      '/api/github/webhook-subscription': GithubWebhookSubscription(
        config: config,
        cache: cache,
        githubChecksService: githubChecksService,
        scheduler: scheduler,
      ),

      /// API to run authenticated graphql queries. It requires to pass the graphql query as the body
      /// of a POST request.
      '/api/query-github-graphql': QueryGithubGraphql(
        config: config,
        authenticationProvider: authProvider,
      ),
      '/api/presubmit-luci-subscription': PresubmitLuciSubscription(
        cache: cache,
        config: config,
        buildBucketClient: buildBucketClient,
        luciBuildService: luciBuildService,
        githubChecksService: githubChecksService,
      ),
      '/api/postsubmit-luci-subscription': PostsubmitLuciSubscription(
        cache: cache,
        config: config,
        scheduler: scheduler,
        githubChecksService: githubChecksService,
      ),
      '/api/push-build-status-to-github': PushBuildStatusToGithub(
        config: config,
        authenticationProvider: authProvider,
      ),
      '/api/push-gold-status-to-github': PushGoldStatusToGithub(
        config: config,
        authenticationProvider: authProvider,
      ),
      '/api/reset-prod-task': ResetProdTask(
        config: config,
        authenticationProvider: authProvider,
        luciBuildService: luciBuildService,
        scheduler: scheduler,
      ),
      '/api/reset-try-task': ResetTryTask(
        config: config,
        authenticationProvider: authProvider,
        scheduler: scheduler,
      ),
      '/api/scheduler/batch-backfiller': BatchBackfiller(
        config: config,
        scheduler: scheduler,
      ),
      '/api/scheduler/batch-request-subscription': SchedulerRequestSubscription(
        cache: cache,
        config: config,
        buildBucketClient: buildBucketClient,
      ),
      '/api/update_existing_flaky_issues': UpdateExistingFlakyIssue(
        config: config,
        authenticationProvider: authProvider,
      ),
      '/api/update-branches': UpdateBranches(
        config: config,
      ),

      /// Updates task related details.
      ///
      /// This API updates task status in datastore and
      /// pushes performance metrics to skia-perf.
      ///
      /// POST: /api-update-status
      ///
      /// Parameters:
      ///   CommitBranch: (string in body). Branch of commit.
      ///   CommitSha: (string in body). Sha of commit.
      ///   BuilderName: (string in body). Name of the luci builder.
      ///   NewStatus: (string in body) required. Status of the task.
      ///   ResultData: (string in body) optional. Benchmark data.
      ///   BenchmarkScoreKeys: (string in body) optional. Benchmark data.
      ///
      /// Response: Status 200 OK
      '/api/update-task-status': UpdateTaskStatus(
        config: config,
        authenticationProvider: swarmingAuthProvider,
      ),
      '/api/vacuum-github-commits': VacuumGithubCommits(
        config: config,
        authenticationProvider: authProvider,
        scheduler: scheduler,
      ),

      /// Returns status of the framework tree.
      ///
      /// Returns serialized proto with enum representing the
      /// status of the tree and list of offending tasks.
      ///
      /// GET: /api/public/build-status
      ///
      /// Parameters:
      ///   branch: (string in query) default: 'master'. Name of the repo branch.
      ///
      /// Response: Status 200 OK
      /// Returns [BuildStatusResponse]:
      ///  {
      ///    1: 2,
      ///    2: [ "win_tool_tests_commands", "win_build_test", "win_module_test"]
      ///   }
      '/api/public/build-status': CacheRequestHandler<Body>(
        cache: cache,
        config: config,
        delegate: GetBuildStatus(config: config),
        ttl: const Duration(seconds: 15),
      ),

      '/api/public/get-release-branches': GetReleaseBranches(config: config, branchService: branchService),

      /// Returns task results for commits.
      ///
      /// Returns result details about each task in each checklist for every commit.
      ///
      /// GET: /api/public/get-status
      ///
      /// Parameters:
      ///   branch: (string in query) default: 'master'. Name of the repo branch.
      ///   lastCommitKey: (string in query) optional. Encoded commit key for the last commit to return resutls.
      ///
      /// Response: Status: 200 OK
      ///   {"Statuses":[
      ///     {"Checklist":{
      ///        "Key":"ah..jgM",
      ///        "Checklist":{"FlutterRepositoryPath":"flutter/flutter",
      ///        "CreateTimestamp":1620134239000,
      ///        "Commit":{"Sha":"7f1d1414cc5f0b0317272ced49a9c0b44e5c3af8",
      ///        "Message":"Revert \"Migrate to ChannelBuffers.push\"",
      ///        "Author":{"Login":"renyou","avatar_url":"https://avatars.githubusercontent.com/u/666474?v=4"}},"Branch":"master"}},
      ///        "Stages":[{"Name":"chromebot",
      ///          "Tasks":[
      ///            {"Task":{
      ///            "ChecklistKey":"ahF..jgM",
      ///            "CreateTimestamp":1620134239000,
      ///            "StartTimestamp":0,
      ///            "EndTimestamp":1620136203757,
      ///            "Name":"linux_cubic_bezier_perf__e2e_summary",
      ///            "Attempts":1,
      ///            "Flaky":false,
      ///            "TimeoutInMinutes":0,
      ///            "Reason":"",
      ///            "BuildNumber":null,
      ///            "BuildNumberList":"1279",
      ///            "BuilderName":"Linux cubic_bezier_perf__e2e_summary",
      ///            "luciBucket":"luci.flutter.prod",
      ///            "RequiredCapabilities":["can-update-github"],
      ///            "ReservedForAgentID":"",
      ///            "StageName":"chromebot",
      ///            "Status":"Succeeded"
      ///            },
      ///          ],
      ///          "Status": "InProgress",
      ///        ]},
      ///       },
      ///     }
      '/api/public/get-status': CacheRequestHandler<Body>(
        cache: cache,
        config: config,
        delegate: GetStatus(config: config),
      ),

      '/api/public/get-green-commits': GetGreenCommits(config: config),

      '/api/public/get-branches': CacheRequestHandler<Body>(
        cache: cache,
        config: config,
        delegate: GetBranches(config: config),
        ttl: const Duration(minutes: 15),
      ),

      /// Record GitHub API quota usage in BigQuery.
      ///
      /// Pushes data to BigQuery for metric collection to
      /// analyze usage over time.
      ///
      /// This api is called via cron job.
      ///
      /// GET: /api/public/github-rate-limit-status
      ///
      /// Response: Status 200 OK
      '/api/public/github-rate-limit-status': CacheRequestHandler<Body>(
        config: config,
        cache: cache,
        ttl: const Duration(minutes: 1),
        delegate: GithubRateLimitStatus(config: config),
      ),
      '/api/public/repos': GetRepos(config: config),

      /// Handler for AppEngine to identify when dart server is ready to serve requests.
      '/readiness_check': ReadinessCheck(config: config),
    };

    return await runAppEngine(
      (HttpRequest request) async {
        if (handlers.containsKey(request.uri.path)) {
          final RequestHandler<dynamic> handler = handlers[request.uri.path]!;
          await handler.service(request);
        } else {
          /// Requests with query parameters and anchors need to be trimmed to get the file path.
          // TODO(chillers): Use toFilePath(), https://github.com/dart-lang/sdk/issues/39373
          final int queryIndex =
              request.uri.path.contains('?') ? request.uri.path.indexOf('?') : request.uri.path.length;
          final int anchorIndex =
              request.uri.path.contains('#') ? request.uri.path.indexOf('#') : request.uri.path.length;

          /// Trim to the first instance of an anchor or query.
          final int trimIndex = min(queryIndex, anchorIndex);
          final String filePath = request.uri.path.substring(0, trimIndex);

          const Map<String, String> redirects = <String, String>{
            '/build.html': '/#/build',
          };
          if (redirects.containsKey(filePath)) {
            request.response.statusCode = HttpStatus.permanentRedirect;
            return await request.response.redirect(Uri.parse(redirects[filePath]!));
          }

          await StaticFileHandler(filePath, config: config).service(request);
        }
      },
      onAcceptingConnections: (InternetAddress address, int port) {
        final String host = address.isLoopback ? 'localhost' : address.host;
        print('Serving requests at http://$host:$port/');
      },
    );
  });
}
