// 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 'package:auto_submit/exception/bigquery_exception.dart';
import 'package:auto_submit/model/big_query_revert_request_record.dart';
import 'package:auto_submit/service/bigquery.dart';
import 'package:auto_submit/service/config.dart';
import 'package:auto_submit/service/github_service.dart';
import 'package:github/github.dart';
import 'package:shelf/shelf.dart';

import '../service/log.dart';
import '../server/authenticated_request_handler.dart';

class UpdateRevertIssues extends AuthenticatedRequestHandler {
  const UpdateRevertIssues({
    required super.config,
    required super.cronAuthProvider,
  });

  @override
  Future<Response> get() async {
    final BigqueryService bigqueryService = await config.createBigQueryService();

    log.info('Updating closed revert request review issues in the database.');
    final List<RevertRequestRecord> revertRequestRecords =
        await bigqueryService.selectOpenReviewRequestIssueRecordsList(projectId: Config.flutterGcpProjectId);

    if (revertRequestRecords.isEmpty) {
      return Response.ok('No open revert reviews to update.');
    }

    final GithubService githubService =
        await config.createGithubService(RepositorySlug(Config.flutter, Config.flutter));

    for (RevertRequestRecord revertRequestRecord in revertRequestRecords) {
      await updateIssue(
        revertRequestRecord: revertRequestRecord,
        bigqueryService: bigqueryService,
        githubService: githubService,
      );
    }

    return Response.ok('Finished processing revert review updates.');
  }

  /// Update the review issue associated with the revert request if it has been
  /// closed.
  Future<bool> updateIssue({
    required RevertRequestRecord revertRequestRecord,
    required BigqueryService bigqueryService,
    required GithubService githubService,
  }) async {
    bool updated = false;
    log.info('Processing review issue# ${revertRequestRecord.reviewIssueNumber}.');
    try {
      // Get the revert review issue.
      Issue issue = await githubService.getIssue(
        slug: RepositorySlug(Config.flutter, Config.flutter),
        issueNumber: revertRequestRecord.reviewIssueNumber!,
      );

      if (issue.isClosed) {
        log.info('Updating review issue# ${issue.number} in database.');
        await bigqueryService.updateReviewRequestIssue(
          projectId: Config.flutterGcpProjectId,
          reviewIssueLandedTimestamp: issue.closedAt!,
          reviewIssueNumber: revertRequestRecord.reviewIssueNumber!,
          reviewIssueClosedBy: issue.closedBy!.login!,
        );
        log.info('Review issue# ${issue.number} updated successfully.');
        updated = true;
      }
    } on BigQueryException catch (exception) {
      log.severe(
        'An error occured while validating and updating review issue# ${revertRequestRecord.reviewIssueNumber}. Exception: ${exception.cause}',
      );
    }
    return updated;
  }
}
