from . import class_subject
from . import dbconfig
from .share import share
from .database import BankAccounts
from .database import BankNames
from .database import Subject

from sqlalchemy.orm.util import outerjoin
from sqlalchemy.orm.query import aliased
from sqlalchemy.sql.functions import *
from gi.repository import Gtk


# config = share.config
## \defgroup Controller
## @{


class BankAccountsClass:
    def __init__(self):
        pass

    def get_bank_names(self):
        return share.config.db.session.query(BankNames).select_from(BankNames).all()

    def get_account(self, id):
        return share.config.db.session.query(BankAccounts).select_from(BankAccounts).filter(BankAccounts.accId == id).first()

    def get_all_accounts(self):
        return share.config.db.session.query(BankAccounts).select_from(BankAccounts).all()

    def get_bank_id(self, name):
        bank = share.config.db.session.query(BankNames).select_from(
            BankNames).filter(BankNames.Name == name).first()
        bank_id = None
        if bank:
            bank_id = bank.Id
        return bank_id

    def get_bank_name(self, id):
        bank = share.config.db.session.query(BankNames).select_from(
            BankNames).filter(BankNames.Id == id).first()
        bank_name = None
        if bank:
            bank_name = bank.Name
        return bank_name

    def add_bank(self, bank_name):
        query = share.config.db.session.query(BankNames).select_from(
            BankNames).filter(BankNames.Name == bank_name).first()
        if query == None:
            share.config.db.session.add(BankNames(bank_name))
            share.config.db.session.commit()

    def addNewBank(self, model):
        dialog = Gtk.Dialog(None, None,
                            Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT,
                            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
                             Gtk.STOCK_OK, Gtk.ResponseType.OK))
        label = Gtk.Label(label='Bank Name:')
        entry = Gtk.Entry()
        dialog.vbox.pack_start(label, False, False, 0)
        dialog.vbox.pack_start(entry, False, False, 0)
        dialog.show_all()
        result = dialog.run()
        bank_name = entry.get_text()
        if result == Gtk.ResponseType.OK and len(bank_name) != 0:
            iter = model.append()
            model.set(iter, 0, bank_name)
            self.add_bank(bank_name)

        dialog.destroy()

    def add_account(self, id, name, number="", type=0, owner="", bank=1, branch="", address="", phone="", webpage="", desc=""):
        bank_id = bank
        dbconf = dbconfig.dbConfig()
        if id == -1:
            bank_account = BankAccounts(
                name, number, type, owner, bank_id, branch, address, phone, webpage, desc)
            share.config.db.session.add(bank_account)
            share.config.db.session.commit()
            sub = class_subject.Subjects()
            # accountId = str(bank_account.accId)
            # accSubjectCode = accountId.rjust(3 - len(accountId)+1 , '0')
            sub.add(dbconf.get_int('bank'), name)
        else:
            query = share.config.db.session.query(
                BankAccounts).filter(BankAccounts.accId == id)
            prevName = query.first().accName
            q = share.config.db.session.query(Subject).filter(Subject.parent_id == (
                dbconf.get_int('bank'))).filter(Subject.name == prevName)
            if q:
                q.update({Subject.name: name})
            query.update({BankAccounts.accName: name,
                          BankAccounts.accNumber: number,
                          BankAccounts.accType: type,
                          BankAccounts.accOwner: owner,
                          BankAccounts.accBank: bank_id,
                          BankAccounts.accBankBranch: branch,
                          BankAccounts.accBankAddress: address,
                          BankAccounts.accBankPhone: phone,
                          BankAccounts.accBankWebPage: webpage,
                          BankAccounts.accDesc: desc})

        if id == -1 and bank_account:
            return bank_account.accId
        return id

    # Delete account from databaSE
    #
    # @param Integer bank account id
    def delete_account(self, id):
        query = share.config.db.session.query(BankAccounts).filter(
            BankAccounts.accId == id)   
        if query:
            accName = query.first() .accName
        query.delete()
        bankSubject = dbconfig.dbConfig().get_int('bank')
        share.config.db.session.query(Subject).filter(
            Subject.parent_id == bankSubject).filter(Subject.name == accName).delete()
        share.config.db.session.commit()

## @}