// Copyright 2022 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:async';

import 'package:appengine/appengine.dart';
import 'package:auto_submit/helpers.dart';
import 'package:auto_submit/request_handling/authentication.dart';
import 'package:auto_submit/requests/check_pull_request.dart';
import 'package:auto_submit/requests/check_revert_request.dart';
import 'package:auto_submit/requests/github_webhook.dart';
import 'package:auto_submit/requests/readiness_check.dart';
import 'package:auto_submit/service/config.dart';
import 'package:cocoon_server/google_auth_provider.dart';
import 'package:cocoon_server/secret_manager.dart';
import 'package:neat_cache/neat_cache.dart';
import 'package:shelf_router/shelf_router.dart';

/// Number of entries allowed in [Cache].
const int kCacheSize = 1024;

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

    final cache = Cache.inMemoryCacheProvider(kCacheSize);
    final config = Config(
      cacheProvider: cache,
      secretManager: await SecretManager.create(
        const GoogleAuthProvider(),
        projectId: Config.flutterGcpProjectId,
      ),
    );
    const authProvider = CronAuthProvider();

    final router =
        Router()
          ..post('/webhook', GithubWebhook(config: config).post)
          ..get(
            '/check-pull-request',
            CheckPullRequest(
              config: config,
              cronAuthProvider: authProvider,
            ).run,
          )
          ..get(
            '/check-revert-requests',
            CheckRevertRequest(
              config: config,
              cronAuthProvider: authProvider,
            ).run,
          )
          ..get('/readiness_check', ReadinessCheck(config: config).run);
    await serveHandler(router.call);
  });
}
