#!/usr/bin/env python3

# Copyright (c) 2020 The Regents of the University of California
# All Rights Reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met: redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer;
# redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution;
# neither the name of the copyright holders nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

from gerrit import GerritResponseParser as Parser
from gerrit import GerritRestAPI
from util import add_maintainers_to_change, convert_time_in_seconds

import json
import time

import sys
sys.path.append('..')
import maint.lib.maintainers


class GerritBotConfig:
    def __init__(self, config = {}):
        self.__dict__.update(config)
    @staticmethod
    def DefaultConfig():
        default_config = GerritBotConfig()

        # path to the file containing the username and password of the
        # Gerrit bot
        default_config.auth_file_path = ".data/auth"

        # path to the file containing the previous time a query to Gerrit
        # REST API was made
        default_config.time_tracker_file_path = ".data/prev_query_time"

        # path to the file containing the map each maintainer email address
        # to the one account id (ie, the "_account_id" field of ReviewerInfo)
        default_config.maintainer_account_ids_file_path = \
            ".data/maintainer_ids.json"

        # query changes made within 2 days if prev_query_time is not specified
        default_config.default_query_age = "2d"

        # path to the maintainers file
        # if it is `None`, the maintainers library will figure that out
        default_config.maintainers_file_path = None

        default_config.api_entry_point = "https://gem5-review.googlesource.com"
        default_config.projects_prefix = "public/gem5"
        default_config.query_limit = 1000 # at most 1000 new changes per query
        default_config.request_timeout = 10 # seconds
        return default_config

class GerritBot:
    def __init__(self, config):
        self.config = config

        self.auth = self.__read_auth_file(self.config.auth_file_path)

        # Initalize the Gerrit API Object
        self.gerrit_api = GerritRestAPI(self.auth,
                                        self.config.api_entry_point,
                                        self.config.request_timeout)

        self.account_id = self.__get_bot_account_id()
        self.maintainers = maint.lib.maintainers.Maintainers.from_file(
            self.config.maintainers_file_path)
        self.maintainer_account_ids = self.__read_maintainer_account_id_file(
            self.maintainers, self.config.maintainer_account_ids_file_path)
    def __read_auth_file(self, auth_file_path):
        username = ""
        password = ""
        with open(auth_file_path, "r") as f:
            lines = f.readlines()
            username = lines[0].strip()
            password = lines[1].strip()
        return (username, password)

    def __read_time_tracker_file(self, file_path):
        prev_query_time = 0

        try:
            with open(file_path, "r") as f:
                lines = f.readlines()
                prev_query_time = int(float(lines[0].strip()))
        except FileNotFoundError:
            print(f"warning: cannot find the time tracker file at "
                  f"`{file_path}`. Previous query time is set to 0.")
        except IndexError:
            print(f"warning: cannot find the content of the time tracker file "
                  f"at `{file_path}`. Previous query time is set 0.")

        return prev_query_time

    def __update_time_tracker_file(self, file_path, prev_query_time):
        with open(file_path, "w") as f:
            f.write(f"{prev_query_time}\n")
            f.write(f"# The above time is the result of calling time.time() "
                    f"in Python.")

    def __read_maintainer_account_id_file(self, maintainers, file_path):
        account_ids = {}
        try:
            with open(file_path, "r") as f:
                account_ids = json.load(f)
        except (FileNotFoundError, json.decoder.JSONDecodeError):
            # create a placeholder file
            with open(file_path, "w") as f:
                json.dump(account_ids, f)
        account_ids = self.__update_maintainer_account_id_file(file_path,
                                                               maintainers)
        return account_ids

    def __update_maintainer_account_id_file(self, file_path, maintainers):
        # get the current map
        with open(file_path, "r") as f:
            account_ids = json.load(f)
        # get maintainer email addresses
        email_addresses = set()
        for tag, subsys in maintainers:
            for maint in subsys.maintainers:
                email_addresses.add(maint[1])
        # get account ids of the addresses
        for email_address in email_addresses:
            if email_address in account_ids:
                continue
            account_id = self.__get_one_account_id(email_address)
            if account_id:
                account_ids[email_address] = account_id
        # write the map to a json file
        with open(file_path, "w") as f:
            json.dump(account_ids, f, indent=4)
        return account_ids

    def __get_one_account_id(self, email_address):
        query = f"email:{email_address}"
        response = self.gerrit_api.query_account(query, 1)
        accounts = Parser.get_json_content(response)
        if len(accounts) == 0:
            print(f"warn: unable to obtain the account id of "
                  f"\"{email_address}\"")
            print(vars(response))
            return None
        return accounts[0]["_account_id"]

    def __get_bot_account_id(self):
        account_info = Parser.parse(self.gerrit_api.get_account("self"))
        return account_info._account_id

    def __query_new_changes(self, query_age):
        query = (f"projects:{self.config.projects_prefix} "
                 f"status:open -is:wip -age:{query_age}")
        response = self.gerrit_api.query_changes(
            query, self.config.query_limit,
            ["CURRENT_REVISION", "REVIEWER_UPDATES", "DETAILED_ACCOUNTS"]
        )

        if response.status_code >= 300:
            print("Error: Couldn't query new Gerrit changes")
            print(vars(query_new_gerrit_changes_response))
            raise Error()

        new_changes = Parser.get_json_content(response)

        return new_changes

    def _pre_run(self):
        self.prev_query_time = \
            self.__read_time_tracker_file(self.config.time_tracker_file_path)
        self.curr_time = time.time()
        if self.prev_query_time > 0:
            # adding 10 seconds to the query age to make sure that
            # we won't miss any new changes
            self.query_age = \
              convert_time_in_seconds(
                int(self.curr_time - self.prev_query_time + 10))
        else:
            self.query_age = self.config.default_query_age

    def _run(self):
        new_changes = self.__query_new_changes(self.query_age)
        for new_change in new_changes:
            add_maintainers_to_change(new_change,
                                      self.maintainers,
                                      self.maintainer_account_ids,
                                      self.gerrit_api)

    def _post_run(self):
        self.__update_time_tracker_file(self.config.time_tracker_file_path,
                                        self.curr_time)

    def run(self):
        self._pre_run()
        self._run()
        self._post_run()

if __name__ == "__main__":
    default_config = GerritBotConfig.DefaultConfig()
    gerrit_bot = GerritBot(default_config)
    gerrit_bot.run()
