#!/usr/bin/env -S python3 -B

#
#    Copyright (c) 2021 Project CHIP Authors
#    All rights reserved.
#
#    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 json
from configparser import ConfigParser
import click
import typing
import re
from os.path import exists
import logging


def convert_ini_to_json(ini_dir: str, json_path: str):
    """ Converts chip-tool INI files found in 'ini_dir' into the JSON format expected by the matter python REPL
        and associated test infrastructure.

        Specifically, this will take the three INI files that correspond to the three example CAs (alpha, beta, gamma)
        and munge them together into a single REPL-compatible JSON file.
    """
    python_json_store = {}

    ini_file_paths = ['/chip_tool_config.alpha.ini', '/chip_tool_config.beta.ini', '/chip_tool_config.gamma.ini']
    counter = 1

    for path in ini_file_paths:
        full_path = ini_dir + path
        if (exists(full_path)):
            logging.critical(f"Found chip tool INI file at: {full_path} - Converting...")
            create_repl_config_from_init(ini_file=full_path,
                                         json_dict=python_json_store, replace_suffix=str(counter))
        counter = counter + 1

    json_file = open(json_path, 'w')
    json.dump(python_json_store, json_file, ensure_ascii=True, indent=4)


def create_repl_config_from_init(ini_file: str, json_dict: typing.Dict, replace_suffix: str):
    ''' This updates a provided JSON dictionary to create a REPL compliant configuration store that
        contains the correct 'repl-config' and 'sdk-config' keys built from the provided chip-tool
        INI file that contains the root public keys. The INI file will typically be named
        with the word 'alpha', 'beta' or 'gamma' in the name.

        ini_file:           Path to source INI file
        json_dict:          JSON dictionary to be updated. Multiple passes through this function using
                            the same dictionary is possible.
        replace_suffix:     The credentials in the INI file typically have keys that end with 0. This suffix
                            can be replaced with a different number.
    '''
    if ('repl-config' not in json_dict):
        json_dict['repl-config'] = {}

    if ('caList' not in json_dict['repl-config']):
        json_dict['repl-config']['caList'] = {}

    json_dict['repl-config']['caList'][replace_suffix] = [
        {'fabricId': int(replace_suffix), 'vendorId': 0XFFF1}
    ]

    if ('sdk-config' not in json_dict):
        json_dict['sdk-config'] = {}

    load_ini_into_dict(ini_file=ini_file, json_dict=json_dict['sdk-config'], replace_suffix=replace_suffix)


def load_ini_into_dict(ini_file: str, json_dict: typing.Dict, replace_suffix: str):
    """ Loads the specific INI file containing CA credential information into the provided dictionary. A 'replace_suffix' string
        has to be provided to convert the existing numerical suffix to a different value.

        NOTE: This does not do any conversion of the keys into a format acceptable by the Python REPL environment. Please see
              create_repl_config_from_init above if that is desired.
    """
    config = ConfigParser()

    # Enable case-sensitive keys.
    config.optionxform = str

    config.read(ini_file)

    for key in config['Default']:
        value = config['Default'][key]
        key = re.sub(r'(.*?)[0-9]+', r'\1', key) + replace_suffix
        json_dict[key] = value


@click.command()
@click.option('--ini-dir', type=click.Path(exists=True), show_default=True, default='/tmp', help='Path to directory containing INI files that chip-tool uses for its tests')
@click.option('--json-path', type=click.Path(exists=False), show_default=True, default='/tmp/repl-storage.json', help='Path to JSON file used by Python infrastructure')
def main(ini_dir: str, json_path: str):
    convert_ini_to_json(ini_dir, json_path)
    return 0


if __name__ == '__main__':
    main()
