#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
Json settings parser. Currently in BETA.
Copyright by aceisace
"""
import json
import os

class settings:
  """Load and validate settings from the settings file"""

  _supported_languages = ['en', 'de', 'ru', 'it', 'es', 'fr', 'el', 'sv', 'nl',
                     'pl', 'ua', 'nb', 'vi', 'zh_tw', 'zh-cn', 'ja', 'ko']
  _supported_units = ['metric', 'imperial']
  _supported_hours = [12, 24]
  _supported_display_orientation = ['normal', 'upside_down']
  _supported_models = [
  'epd_7_in_5_v2_colour', 'epd_7_in_5_v2',
  'epd_7_in_5_colour', 'epd_7_in_5',
  'epd_5_in_83_colour','epd_5_in_83',
  'epd_4_in_2_colour', 'epd_4_in_2'
  ]

  def __init__(self, settings_file_path):
    """Load settings from path (folder or settings.json file)"""
    try:
      # If
      if settings_file_path.endswith('settings.json'):
        folder = settings_file_path.split('/settings.json')[0]
      else:
        folder = settings_file_path

      os.chdir(folder)
      with open("settings.json") as file:
        settings = json.load(file)
        self._settings = settings

    except FileNotFoundError:
      print('No settings file found in specified location')

    self._validate()

  def _validate(self):
    """Validate the basic config"""
    settings = self._settings

    required =  ['language', 'units', 'hours', 'model', 'calibration_hours',
            'display_orientation']

    # Check if all required settings exist
    for param in required:
      if not param in settings:
        raise Exception (
          'required parameter: {} not found in settings file!'.format(param))

    # Attempt to parse the parameters
    self.language = settings['language']
    self.units = settings['units']
    self.hours = settings['hours']
    self.model = settings['model']
    self.calibration_hours = settings['calibration_hours']
    self.display_orientation = settings['display_orientation']

    # Validate the parameters
    if (not isinstance(self.language, str) or self.language not in
        self._supported_languages):
      print('Language not supported, switching to fallback, en')
      self.language = 'en'

    if (not isinstance(self.units, str) or self.units not in
        self._supported_units):
      print('units not supported, switching to fallback, metric')
      self.units = 'metric'

    if (not isinstance(self.hours, int) or self.hours not in
        self._supported_hours):
      print('hour-format not supported, switching to fallback, 24')
      self.hours = 24

    if (not isinstance(self.model, str) or self.model not in
        self._supported_models):
      print('model not supported, switching to fallback, epd_7_in_5')
      self.model = 'epd_7_in_5'

    if (not isinstance(self.calibration_hours, list)):
      print('calibration_hours not supported, switching to fallback, [0,12,18]')
      self.calibration_hours = [0,12,18]

    if (not isinstance(self.display_orientation, str) or self.display_orientation not in
        self._supported_display_orientation):
      print('display orientation not supported, switching to fallback, normal')
      self.display_orientation = 'normal'

    print('Settings file loaded')

  def _active_modules(self):
    modules = [section['type'] for section in self._settings['panels']]
    return modules

  def get_config(self, module_name):
    """Ge the config of this module"""
    if module_name not in self._active_modules():
      print('No config is available for this module')
    else:
      for section in self._settings['panels']:
        if section['type'] == module_name:
          config = section['config']
    return config

  def get_position(self, module_name):
    """Get the position of this module's image on the display"""
    if module_name not in self._active_modules():
      print('No position is available for this module')
    else:
      for section in self._settings['panels']:
        if section['type'] == module_name:
          position = section['location']
    return position

if __name__ == '__main__':
  print('running {0} in standalone/debug mode'.format(
    os.path.basename(__file__).split('.py')[0]))