// 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/requests/update_revert_issues.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,
      )
      ..get(
        '/update-revert-issues',
        UpdateRevertIssues(
          config: config,
          cronAuthProvider: authProvider,
        ).run,
      );
    await serveHandler(router);
  });
}
