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

import argparse
import dtv2
import colour
import json
import os


home = os.environ['HOME']

parseur_args = argparse.ArgumentParser(
    description="""Change Drevo tyrfing keys colors""")
parseur_args.add_argument('-r', '--read',
                          action="store_true",
                          help='read and apply saved config')
parseur_args.add_argument('-n', '--new',
                          action="store_true",
                          help='replace or create config file')
parseur_args.add_argument('-chg', '--change',
                          action="store_true",
                          help='change config with args and store changes')
parseur_args.add_argument('-kbd', '--keyboard',
                          help='svg_color_name')
parseur_args.add_argument('-cat', '--category',
                          nargs='+',
                          help='category_name svg_color_name')
parseur_args.add_argument('-key', '--key',
                          nargs='+',
                          help='key_name svg_color_name')
args = parseur_args.parse_args()


def apply_changes(kbd, dico):
    if 'kbd' in dico:
        kbd.kbd(colour.COLOR_NAME_TO_RGB[dico['kbd']])
    #
    if 'cat' in dico:
        for k, v in dico['cat'].items():
            kbd.category(k, colour.COLOR_NAME_TO_RGB[v])
    #
    if 'key' in dico:
        for k, v in dico['key'].items():
            kbd.key(k, colour.COLOR_NAME_TO_RGB[v])


def dico_saved_config(fname):
    with open(fname) as fh:
        config = fh.read()
    return json.loads(config)


clavier = dtv2.dtv2()

fichier_config = home + "/.dtv2change"

# read option
# it reads current config, apply and exit
if args.read:
    dico_config = dico_saved_config(fichier_config)
    apply_changes(clavier, dico_config)
    quit()

# change option
# it reads current config and will change it with other CLI
# parameters
if args.change:
    dico_config = dico_saved_config(fichier_config)

#
# construction du dictionnaire demandé
dico_config_demandee = {}

color_message = """This color does not exist!
Please see https://www.w3.org/TR/css-color-3/#svg-color"""

category_message = f"""This category does not exist!
Available categories are {list(dtv2.category_keys.keys())}"""

if args.keyboard and args.keyboard not in colour.COLOR_NAME_TO_RGB:
    print(color_message)
elif args.keyboard:
    couleur = colour.COLOR_NAME_TO_RGB[args.keyboard]
    dico_config_demandee['kbd'] = args.keyboard
#
if args.category and len(args.category) < 2:
    print("""Need a category name AND a color name""")
elif args.category and len(args.category) % 2 == 0:
    dico_categorie = {}
    for k, v in {args.category[i]: args.category[i + 1]
                 for i in range(0, len(args.category), 2)}.items():
        if k not in dtv2.category_keys:
            print(category_message)
            continue
        if v not in colour.COLOR_NAME_TO_RGB:
            print(color_message)
            continue
        dico_categorie[k] = v
    dico_config_demandee['cat'] = dico_categorie
#
if args.key and len(args.key) < 2:
    print("""Need a key name AND a color name""")
elif args.key and len(args.key) % 2 == 0:
    dico_key = {}
    for k, v in {args.key[i]: args.key[i + 1]
                 for i in range(0, len(args.key), 2)}.items():
        if k not in dtv2.keys:
            print("""This key does not exist!
Look at your keyboard!""")
            continue
        if v not in colour.COLOR_NAME_TO_RGB:
            print(color_message)
            continue
        dico_key[k] = v
    dico_config_demandee['key'] = dico_key

apply_changes(clavier, dico_config_demandee)

if args.new:
    with open(fichier_config, "w+") as fh:
        fh.write(json.dumps(dico_config_demandee))

if args.change:
    if 'kbd' in dico_config_demandee:
        dico_config['kbd'] = dico_config_demandee['kbd']
    if 'cat' in dico_config and 'cat' in dico_config_demandee:
        dico_config['cat'].update(dico_config_demandee['cat'])
    elif 'cat' in dico_config_demandee:
        dico_config['cat'] = dico_config_demandee['cat']
    if 'key' in dico_config and 'key' in dico_config_demandee:
        dico_config['key'].update(dico_config_demandee['key'])
    elif 'key' in dico_config_demandee:
        dico_config['key'] = dico_config_demandee['key']
    with open(fichier_config, "w+") as fh:
        fh.write(json.dumps(dico_config))
