# =========================================================================
#          FILE: Appconfig.py
#
#         USAGE: ---
#
#   DESCRIPTION: This define all configuration used in Application.
#
#       OPTIONS: ---
#  REQUIREMENTS: ---
#          BUGS: ---
#         NOTES: ---
#        AUTHOR: Fahim Khan, fahim.elex@gmail.com
#      MODIFIED: Rahul Paknikar, rahulp@cse.iitb.ac.in
#  ORGANIZATION: eSim Team at FOSSEE, IIT Bombay
#       CREATED: Tuesday 24 February 2015
#      REVISION: Tuesday 13 September 2022
# =========================================================================

from PyQt5 import QtWidgets
import os
import json
from configparser import ConfigParser


class Appconfig(QtWidgets.QWidget):
    """
    All configuration goes here.
    May change in future for code optimization.

    This class also contains function for
    - Printing error.
    - Showing warnings.
    - Displaying information.
    """

    # Home directory
    if os.name == 'nt':
        user_home = os.path.join('library', 'config')
    else:
        user_home = os.path.expanduser('~')

    try:
        file = open(os.path.join(
            user_home, ".esim/workspace.txt"), 'r'
        )
        workspace_check, home = file.readline().split(' ', 1)
        file.close()
    except IOError:
        home = os.path.join(os.path.expanduser("~"), "eSim-Workspace")
        workspace_check = 0

    default_workspace = {"workspace": home}
    # Current Project detail
    current_project = {"ProjectName": None}
    # Current Subcircuit detail
    current_subcircuit = {"SubcircuitName": None}
    # Workspace detail
    workspace_text = "eSim stores your project in a folder called "
    workspace_text += "eSim-Workspace. You can choose a different "
    workspace_text += "workspace folder to use for this session."

    procThread_list = []
    proc_dict = {}  # hold pids of all external windows of the current project
    dock_dict = {}  # holds all dockwidgets
    dictPath = {"path": os.path.join(
        default_workspace["workspace"], ".projectExplorer.txt")
    }

    noteArea = {"Note": []}

    parser_esim = ConfigParser()
    parser_esim.read(
        os.path.join(user_home, '.esim', 'config.ini')
    )

    # Try catch added, since eSim cannot be accessed under parser for Win10
    try:
        modelica_map_json = parser_esim.get('eSim', 'MODELICA_MAP_JSON')
    except BaseException as e:
        print("Cannot access Modelica map file --- .esim folder")
        print(str(e))

    # Open file and read KiCad config path
    try:
        init_path = '../../'
        if os.name == 'nt':
            init_path = ''

        file = open(init_path +
                    'library/supportFiles/kicad_config_path.txt', 'r')
        kicad_path = file.read().rstrip()
        file.close()
    except BaseException as e:
        kicad_path = None
        print(str(e))

    try:
        project_explorer = json.load(open(dictPath["path"]))
    except BaseException:
        project_explorer = {}
    process_obj = []

    def __init__(self):
        super(Appconfig, self).__init__()

        # Application Details
        self._APPLICATION = 'eSim'
        self._VERSION = '2.3'
        self._AUTHOR = 'Fahim'
        self._REVISION = 'Rahul, Sumanto'

        # Application geometry setting
        self._app_xpos = 100
        self._app_ypos = 100
        self._app_width = 600
        self._app_heigth = 400

    def print_info(self, info):
        self.noteArea['Note'].append('[INFO]: ' + info)

    def print_warning(self, warning):
        self.noteArea['Note'].append('[WARNING]: ' + warning)

    def print_error(self, error):
        self.noteArea['Note'].append('[ERROR]: ' + error)
