from sqlalchemy import Column, Integer, String, ForeignKey, Table, create_engine, MetaData, Date, DateTime, Float, Boolean
from sqlalchemy.orm import relationship, backref, scoped_session, sessionmaker, relation
from sqlalchemy.ext.declarative import declarative_base
import sqlalchemy

class DatabaseApplication:

    def __init__(self, name, json_config, logger):

        self.m_name           = name
        self.m_log            = logger

        self.m_type           = json_config["Type"]
        self.m_address_list   = json_config["Address List"]
        self.m_user           = json_config["User"]
        self.m_password       = json_config["Password"]
        self.m_database_name  = json_config["Database Name"]

        # Super nasty bug when this is True
        self.m_autocommit     = False
        if json_config["Autocommit"] == "True":
            self.m_autocommit = True
        
        self.m_autoflush      = False
        if json_config["Autoflush"] == "True":
            self.m_autoflush  = True

        self.m_debug          = False
        if json_config["Debug"] == "True":
            self.m_debug      = True

        self.m_connection_str = ""

        self.m_session        = None
        self.m_connection     = None
        self.m_engine         = None

    # end of __init__


    def lg(self, msg, level=6):

        full_msg = self.m_name + ": " + msg

        if self.m_debug:
            print full_msg

        if self.m_log != None:
            self.m_log.log(full_msg, level)

        return None
    # end of lg


    def build_connection_string(self):

        if self.m_type == "MySQL":
            self.m_connection_str = "mysql://" + str(self.m_user) + ":" + str(self.m_password) + "@" + str(self.m_address_list.split()[0]) + "/" + str(self.m_database_name)
        else:
            self.lg("Unable to connect to database type(" + str(self.m_type) + ")", 0)
            self.m_connection_str = None

        return None
    # end of build_connection_string


    def connect(self):

        self.build_connection_string()
        if self.m_connection_str == None:
            self.lg("Not connecting to this database", 0)
            return None
        
        self.lg("Connecting to databases(" + str(self.m_connection_str) + ") Autocommit(" + str(self.m_autocommit) + ") Autoflush(" + str(self.m_autoflush) + ")", 7)

        Base = declarative_base()

        self.m_engine       = create_engine(self.m_connection_str,
                                                echo=False)

        self.m_connection   = self.m_engine.connect()
        self.m_session      = scoped_session(sessionmaker(autocommit  = self.m_autocommit,
                                                            autoflush = self.m_autoflush,
                                                            bind      = self.m_engine))

        self.lg("Connected to DB(" + str(self.m_name) + ") DBTables(" + str(self.m_database_name) + ")", 7)
        return None
    # end of connect
    

    def disconnect(self):
        return None
    # end of disconnect

    def add_record(self, record):
        self.m_session.add(record)
        return None
    # end of add_record


    def commit_all(self):
        self.m_session.commit()
        return None
    # end of commit_all

# end of DatabaseApplication