#!python
__author__ = "david cobac"
__email__ = "david.cobac @ gmail.com"
__year__ = 2020
__last_modified__ = 20210524

import argparse
import dtv2
import colour
import json
import ast
import re


parseur_args = argparse.ArgumentParser(
    description="""Change Drevo tyrfing keys colors""")
parseur_args.add_argument('filename', help='config_file_name (json)')
parseur_args.add_argument('-V', '--version',
                          action="store_true",
                          help='display version (last modif. date)')
args = parseur_args.parse_args()


def user_entry_to_color_tuple(user_color):
    """ return a RGB int tuple so it can be used
    with dtv2

    user_color: str object 
    """

    # searching for rgb or hsl color writing
    reg = re.compile("(.+)=(.+)")
    mat = reg.match(user_color)
    if mat is not None:
        mode = mat.group(1).strip()
        color_tuple = mat.group(2).strip()
        color_tuple = ast.literal_eval(color_tuple)
        if mode == "rgb":
            u_color = colour.Color(rgb=color_tuple)
        elif mode == "hsl":
            u_color = colour.Color(hsl=color_tuple)
        else:
            print(f"Unknown {user_color}")
            exit()
    else:
        u_color = colour.Color(user_color)
    return tuple(round(255 * c) for c in u_color.rgb)


def apply_changes(kbd, dico):
    dico_final = {}
    #
    if 'kbd' in dico:
        for key in kbd._keys:
            dico_final[key] = user_entry_to_color_tuple(dico['kbd'])
    #
    if 'cat' in dico:
        for cat, v in dico['cat'].items():
            for key in kbd._category_keys[cat]:
                dico_final[key] = user_entry_to_color_tuple(v)
    #
    if 'key' in dico:
        for key, v in dico['key'].items():
            dico_final[key] = user_entry_to_color_tuple(v)
    #
    #
    kbd.key_set(dico_final)


if args.version:
    print(f"dtv2reader version {__last_modified__}")

clavier = dtv2.dtv2()

with open(args.filename) as fh:
    config = fh.read()
    dico_config = json.loads(config)
    apply_changes(clavier, dico_config)
