# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
import re
import sys

import github

ZUUL_MESSAGE = sys.argv[1]

def construct_issue_list(match_list: list) -> list:
    new_list = []
    for _issue in match_list:
        try:
            new_list.append(int(_issue))
        except ValueError:
            logging.warning(f'Value {_issue} could not be converted to `int` type')
    return new_list


def parse_issue_number(commit_msg: str) -> dict:
    # Searches for Relates-To or Closes tags first to match and return
    logging.debug(f'Parsing commit message: {commit_msg}')
    related = re.findall(r'(?<=Relates-To: #)([0-9]+?)(?=\n)', commit_msg)
    logging.debug(f'Captured related issues: {related}')
    closes = re.findall(r'(?<=Closes: #)([0-9]+?)(?=\n)', commit_msg)
    logging.debug(f'Captured closes issues: {closes}')
    if related or closes:
        return {
            'related': construct_issue_list(related),
            'closes': construct_issue_list(closes)
        }
    # If no Relates-To or Closes tags are defined, find legacy [#X] style tags
    logging.debug('Falling back to legacy tags')
    legacy_matches = re.findall(r'(?<=\[#)([0-9]+?)(?=\])', commit_msg)
    logging.debug(f'Captured legacy issues: {legacy_matches}')
    if not legacy_matches:
        return {}
    return {
        'related': construct_issue_list(legacy_matches)
    }


def remove_duplicated_issue_numbers(issue_dict: dict) -> dict:
    if 'closes' in issue_dict:
        issue_dict['related'] = [x for x in issue_dict.get('related', []) if x not in issue_dict['closes']]
    return issue_dict

if __name__ == '__main__':
    issue_number_dict = parse_issue_number(ZUUL_MESSAGE)
    issue_number_dict = remove_duplicated_issue_numbers(issue_number_dict)

    if not issue_number_dict:
        logging.debug(
            f'ERROR: Use Tag(Relates-To or Closes) in the commit message with issue number to link GitHub Issue.')
        sys.exit(1)