#!/usr/bin/env python3
import vu1
import sys
import pdb
import json
import yaml
import requests
import argparse

from dial_configs import *

parser = argparse.ArgumentParser()
parser.add_argument('-c', '--config')
args = parser.parse_args()

def get_config(config_file_path="config.yaml"):
  config = {}
  with open(config_file_path, "r") as fd:
    config = yaml.safe_load(fd.read())
  return config

def find_dial(config, id_or_alias):
  dials = config.get("dials", {})
  if id_or_alias in dials:
    return id_or_alias
  else:
    for k, dial in dials.items():
      if id_or_alias in dial.get("aliases", []):
        return k
  return None

config = get_config(args.config)
print(config, flush=True)

api_config = config.get("vuserver", {}).get("api", {})
API = vu1.DialServer(api_config.get("url", "http://localhost:5340"), api_config.get("password", ""))

# generate objects with according dial objects based on user config
config_set = []
for metric, dial in config.get("config_sets", {}).get("notebook", []).items():
  d = API.dials[API.dials.index(find_dial(config, dial))]
  m = getattr(eval(metric), metric)(d, config.get("assets", "./assets")) # build instance of a matching dial_config class
  config_set.append(m)

for line in sys.stdin:
  metric = json.loads(line)
  fields = metric.get("fields", {})
  if metric in config_set:
    dial_config = config_set[config_set.index(metric)]
    #print("config for {metric_name} matched {conf}".format(metric_name=metric.get("name", "<noname>"), conf=type(dial_config)), flush=True)
    value = dial_config.transform_value(metric)
    image = dial_config.background_image
    color = dial_config.transform_color(value)
    dial = dial_config.dial
    try:
      dial.image = image
      dial.value = value
      dial.color = color
    except Exception:
      pass
  continue