import pyodbc
import os
import logging
import datetime
from tomllib import load
from inexLogging import inexLog
import inexConnect
from inexDataModel import dataTemplate
from inexDataProcessing import processData
import json
import decimal

class Inex:
    def __init__(self):
        """Initilize config, calls functions from inex-connect.py and inex-logging.py"""
        if os.path.exists('./config.toml'):
            config_file_path = './config.toml'
            with open(config_file_path, 'rb') as c:
                self.config = load(c)

        # assign libraries
        self.db = pyodbc
        self.tm = datetime
        self.il = logging
        self.ic = inexConnect

        # set config
        self.dbDriver = self.config["database"]["driver"]
        self.dbServer = self.config["database"]["server"]
        self.dbDatabase = self.config["database"]["database"]
        self.dbUser = self.config["database"]["user"]
        self.dbPassword = self.config["database"]["password"]
        self.dbQuery = self.config["database"]["query"]
        self.outputFile = self.config["output"]["filename"]
        self.useLog = self.config["logging"]["useLog"]
        self.logPath = self.config["logging"]["logPath"]
        self.logLevel = self.config["logging"]["logLevel"]
        
        #Setup logging
        inexLog(self)

        # create the connection to the database
        self.cursor = self.ic.connectDatabase(self, self.db, self.dbDriver, self.dbServer, self.dbDatabase, self.dbUser, self.dbPassword)

        self.data = self.ic.databaseQuery(self, self.cursor, self.dbQuery)
        # print(f"returned data: {self.data}")
        self.modifiedData = processData(self.data, dataTemplate)

        print(self.modifiedData)

        # TODO: move this to its own function
        if self.useLog:
            self.il.warning(f"Writing to '{self.outputFile}'.")

        with open(self.outputFile, "w") as f:
            json.dump(self.modifiedData, f, indent = 2, cls=Encoder)

# TODO: Move this class to it's own file
class Encoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            return int(o)
        if isinstance(o, datetime.datetime):
            return str(o)
        return super().default(o)

# Run
if  __name__== "__main__":
    Inex()