#!/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
import logging
import re
from configparser import ConfigParser
from os.path import exists

import click

log = logging.getLogger(__name__)


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)):
            log.critical("Found chip tool INI file at: '%s' - Converting...", full_path)
            create_repl_config_from_init(ini_file=full_path,
                                         json_dict=python_json_store, replace_suffix=str(counter))
        counter = counter + 1

    with open(json_path, 'w') as f:
        json.dump(python_json_store, f, ensure_ascii=True, indent=4)


def create_repl_config_from_init(ini_file: str, json_dict: 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: 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(auto_envvar_prefix='CHIP')
