// 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/github_webhook.dart';
import 'package:auto_submit/requests/readiness_check.dart';
import 'package:auto_submit/service/config.dart';
import 'package:auto_submit/service/secrets.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 = Config(
      cacheProvider: cache,
      secretManager: CloudSecretManager(),
    );
    const CronAuthProvider authProvider = CronAuthProvider();

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