#!/usr/bin/env python3
# Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.

import historic_run
import json
import os
import perf
import time
import utils

import sys

APPS = ['NowInAndroidApp', 'TiviApp']
TARGETS = ['r8-full']
NUM_COMMITS = 250

INDEX_HTML = os.path.join(utils.TOOLS_DIR, 'perf/index.html')


def DownloadCloudBucket(dest):
    os.makedirs(dest)
    utils.download_file_from_cloud_storage(perf.GetGSLocation('*'),
                                           dest,
                                           concurrent=True,
                                           flags=['-R'])


def ParseJsonFromCloudStorage(filename, local_bucket):
    abs_path = os.path.join(local_bucket, filename)
    if not os.path.exists(abs_path):
        return None
    with open(abs_path, 'r') as f:
        lines = f.readlines()
        content = ''.join(lines)
        try:
            return json.loads(content)
        except:
            return None


def run():
    # Get the N most recent commits sorted by newest first.
    top = utils.get_sha1_from_revision('origin/main')
    bottom = utils.get_nth_sha1_from_revision(NUM_COMMITS - 1, 'origin/main')
    commits = historic_run.enumerate_git_commits(top, bottom)
    assert len(commits) == NUM_COMMITS

    # Download all benchmark data from the cloud bucket to a temp folder.
    with utils.TempDir() as temp:
        local_bucket = os.path.join(temp, perf.BUCKET)
        DownloadCloudBucket(local_bucket)

        # Aggregate all the result.json files into a single benchmark_data.json file
        # that has the same format as tools/perf/benchmark_data.json.
        benchmark_data = []
        for commit in commits:
            benchmarks = {}
            for app in APPS:
                for target in TARGETS:
                    filename = perf.GetArtifactLocation(app, target,
                                                        commit.hash(),
                                                        'result.json')
                    app_benchmark_data = ParseJsonFromCloudStorage(
                        filename, local_bucket)
                    if app_benchmark_data:
                        benchmarks[app] = app_benchmark_data
            if benchmarks or benchmark_data:
                benchmark_data.append({
                    'author': commit.author_name(),
                    'hash': commit.hash(),
                    'submitted': commit.committer_timestamp(),
                    'title': commit.title(),
                    'benchmarks': benchmarks
                })

        # Trim data.
        new_benchmark_data_len = len(benchmark_data)
        while new_benchmark_data_len > 0:
            candidate_len = new_benchmark_data_len - 1
            if not benchmark_data[candidate_len]['benchmarks']:
                new_benchmark_data_len = candidate_len
            else:
                break
        benchmark_data = benchmark_data[0:new_benchmark_data_len]

        # Serialize JSON to temp file.
        benchmark_data_file = os.path.join(temp, 'benchmark_data.json')
        with open(benchmark_data_file, 'w') as f:
            json.dump(benchmark_data, f)

        # Write output files to public bucket.
        perf.ArchiveOutputFile(benchmark_data_file,
                               'perf/benchmark_data.json',
                               header='Cache-Control:no-store')
        perf.ArchiveOutputFile(INDEX_HTML, 'perf/index.html')


def main():
    run()


if __name__ == '__main__':
    sys.exit(main())
