#!/usr/bin/env python3
__author__ = "david cobac"
__email__ = "david.cobac@gmail.com"
__year__ = 2020
__last_modified__ = 20210625

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)')
parseur_args.add_argument('-o', '--json',
                          action="store_true",
                          help='outputs keys assignment json')
args = parseur_args.parse_args()


def user_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):
    # build new dict
    new_dict = only_keys(kbd, dico)
    kbd.key_set(new_dict)
    if args.json:
        print(json.dumps(new_dict))


def only_keys(kbd, dico):
    dico_touches = {}
    if 'kbd' in dico:
        for k in kbd._keys:
            dico_touches[k] = user_to_color_tuple(
                dico['kbd']
            )
    if 'cat' in dico:
        for categ in dico['cat']:
            for k in kbd._category_keys[categ]:
                dico_touches[k] = user_to_color_tuple(
                    dico['cat'][categ]
                )
    if 'key' in dico:
        for k in dico['key']:
            dico_touches[k] = user_to_color_tuple(
                dico['key'][k]
            )
    return dico_touches


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

clavier = dtv2.dtv2()

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