#!/usr/bin/python3

import argparse
import json
import os


class subcmd:
    def __init__(self, parser: argparse._SubParsersAction) -> None:
        p = parser.add_parser(
            "report", help="Create final report"
        )

        p.set_defaults(cmd=self)


    def run(self, args: argparse.Namespace) -> int:
        commits_fp = os.path.join(args.dir, "commits.json")
        reviews_fp = os.path.join(args.dir, "reviews.json")

        results = {}

        if not os.path.isfile(commits_fp):
            print("Missing commits.json; run analyze-commits?");
            return 1

        if not os.path.isfile(reviews_fp):
            print("Missing reviews.json; run analyze-reviews?");
            return 1

        with open(commits_fp, "r") as commits_file:
            commits = json.load(commits_file)

        with open(reviews_fp, "r") as reviews_file:
            reviews = json.load(reviews_file)

        for user in sorted(set(commits.keys()).union(reviews.keys())):
            user_commits = len(commits.get(user, []))
            user_reviews = len(reviews.get(user, []))

            points = user_commits * 3 + user_reviews
            print(user, points, user_commits, user_reviews)

            qualified = points >= 15

            results[user] = { "qualified": qualified, "points": points,
                    "commits": user_commits, "reviews": user_reviews }

        with open(os.path.join(args.dir, "report.json"), "w") as outfile:
            outfile.write(json.dumps(results, indent = 4))

        return 0
