#
# Aura Engine API (https://gitlab.servus.at/aura/engine-api)
#
# Copyright (C) 2020 - The Aura Engine Team.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


import os
import os.path
import sys
import logging

from pathlib import Path
from configparser import ConfigParser


class AuraConfig:
    """ 
    AuraConfig Class
    
    Holds the Aura Configuration as in the file `engine-api.ini`.
    """
    ini_path = ""
    logger = None


    def __init__(self, ini_path="/etc/aura/engine-api.ini"): 
        """
        Initializes the configuration, defaults to `/etc/aura/engine.ini`.
        If this file doesn't exist it uses `./config/engine.ini` from
        the project directory.

        Args:
            ini_path(String):      The path to the configuration file `engine-api.ini`
        """
        config_file = Path(ini_path)
        if not config_file.is_file():
            ini_path = "%s/config/engine-api.ini" % Path(__file__).parent.parent.parent.absolute()

        self.ini_path = ini_path
        self.logger = logging.getLogger("AuraEngineApi")
        self.load_config()



    def set(self, key, value):
        """
        Setter for some specific config property.

        Args:
            key (String):   key
            default (*):    value
        """
        try:
            self.__dict__[key] = int(value)
        except:
            self.__dict__[key] = str(value)



    def get(self, key, default=None):
        """
        Getter for some specific config property.

        Args:
            key (String):   key
            default (*):    value
        """
        if key not in self.__dict__:
            if default:
                self.set(key, default)
            else:
                self.logger.warning("Key " + key + " not found in configfile " + self.ini_path + "!")
                return None

        if key == "loglevel":
            loglvl = self.__dict__[key]

            if loglvl == "debug":
                return logging.DEBUG
            elif loglvl == "info":
                return logging.INFO
            elif loglvl == "warning":
                return logging.WARNING
            elif loglvl == "error":
                return logging.ERROR
            else:
                return logging.CRITICAL

        if key == "debug":
            return self.__dict__[key].count("y")

        return self.__dict__[key]



    def load_config(self):
        """
        Set config defaults and load settings from file
        """
        if not os.path.isfile(self.ini_path):
            self.logger.critical(self.ini_path + " not found  :(")
            sys.exit(1)

        # Read the file
        f = open(self.ini_path, 'r')
        ini_str = f.read()
        f.close()

        # Parse the values
        config_parser = ConfigParser()
        try:
            config_parser.read_string(ini_str)
        except Exception as e:
            self.logger.critical("Cannot read " + self.ini_path + "! Reason: " + str(e))
            sys.exit(0)

        for section in config_parser.sections():
            for key, value in config_parser.items(section):
                v = config_parser.get(section, key).replace('"', '').strip()
                self.set(key, v)

        # Custom overrides and defaults
        self.set("install_dir", os.path.realpath(__file__ + ".."))
        self.set("api_prefix", "/api/v1")



    def get_database_uri(self):
        """
        Retrieves the database connection string.
        """
        db_name = str(self.get("db_name"))
        db_user = str(self.get("db_user"))
        db_pass = str(self.get("db_pass"))
        db_host = str(self.get("db_host"))
        db_charset = self.get("db_charset", "utf8")
        return "mysql://" + db_user + ":" + db_pass + "@" + db_host + "/" + db_name + "?charset=" + db_charset