def __init__(self, parent=None):
        """"""
        super(FaktureraMeraWindow, self).__init__(parent)

        self.ui = Ui_MainWindow()
        self.newCustomerActivated = False
        self.ui.setupUi(self)
        self.updateHistoryTable()
        job = JobForm()
        self.jobList = [job]
        self.ui.jobsLayout.addWidget(job)
        self.populateCustomers()
        self.newCustomerForm = NewCustomerForm()
        self.newCustomerForm.hide()
        self.ui.newCustomerLayout.addWidget(self.newCustomerForm)
        self.edit_bill_id = 0
class FaktureraMeraWindow(QMainWindow):
    def __init__(self, parent=None):
        """"""
        super(FaktureraMeraWindow, self).__init__(parent)

        self.ui = Ui_MainWindow()
        self.newCustomerActivated = False
        self.ui.setupUi(self)
        self.updateHistoryTable()
        job = JobForm()
        self.jobList = [job]
        self.ui.jobsLayout.addWidget(job)
        self.populateCustomers()
        self.newCustomerForm = NewCustomerForm()
        self.newCustomerForm.hide()
        self.ui.newCustomerLayout.addWidget(self.newCustomerForm)
        self.edit_bill_id = 0

    def populateCustomers(self):
        query = QSqlQuery()
        self.ui.customerChooser.clear()
        query.exec_('select id, name,address, zipcode from customer')
        while query.next():
            c = self.extractCustomer(query)
            self.ui.customerChooser.addItem(c.name)

    def updateBill(self, bill_id, reference, cId):
        dateFormat = 'yyyy-MM-dd'
        date = QDate.currentDate()
        query = QSqlQuery()
        sql = "update bill set c_id={0}, reference='{1}', bill_date='{2}' where id='{3}'".format(cId, reference,
                                                                                        date.toString(dateFormat),
                                                                                           bill_id)
        query.exec_(sql)
        sql = "delete from jobs where b_id='{0}'".format(bill_id)
        query.exec_(sql)
        query.exec_("select id, c_id, reference, bill_date from bill where id='{0}'".format(bill_id))
        query.next()
        return self.extractBill(query)

    def newBill(self, reference, cId):
        """"""
        dateFormat = 'yyyy-MM-dd'
        date = QDate.currentDate()
        query = QSqlQuery()
        sql = "insert into bill values((select max(id) from bill) + 1,'{0}','{1}','{2}',0,NULL)".format(cId, reference,
                                                                                                        date.toString(
                                                                                                            dateFormat))
        query.exec_(sql)
        query.exec_('select id, c_id, reference, bill_date from bill order by id desc limit 1')
        query.next()
        return self.extractBill(query)

    def newCustomer(self, name, address, zip):
        query = QSqlQuery()
        sql = "insert into customer values((select max(id) from customer) + 1,'{0}','{1}','{2}')".format(name, address,
                                                                                                         zip)
        query.exec_(sql)
        query.exec_('select id, name,address, zipcode from customer order by id desc limit 1')
        query.next()
        return self.extractCustomer(query)


    def newJob(self, price, number, text, bId):
        query = QSqlQuery()
        sql = "insert into jobs values((select max(id) from jobs) + 1,'{0}','{1}','{2}','{3}')".format(bId, number,
                                                                                                       price, text)
        query.exec_(sql)
        query.exec_('select hours, price,job,id from jobs order by id desc limit 1')
        return self.extractJobs(query)[0]

    # kanske en nivå för varningar?
    def validateForSubmit(self):
        errorMsgs = []
        reference = self.ui.referenceField.text()
        if reference == "":
            errorMsgs.append("Du har glömt referensfältet")
        counter = 1
        for j in self.jobList:

            if j.ui.description.text() == "":
                errorMsgs.append("Du har glömt beskrivning på job " + str(counter))
            try:
                float(j.ui.price.text().replace(",", "."))
            except Exception:
                errorMsgs.append("Det ser inte ut som en siffra på priset på job " + str(counter))
            try:
                int(j.ui.number.text())
            except Exception:
                errorMsgs.append("Det ser inte ut som en siffra på antalet på job " + str(counter))
            counter += 1
        # TODO: if new customer is added
        if self.newCustomerActivated:
            if self.newCustomerForm.ui.name.text() == "":
                errorMsgs.append("Det finns inget namn på den nya kunden")
            if self.newCustomerForm.ui.address.text() == "":
                errorMsgs.append("Det finns ingen address på den nya kunden")
            if self.newCustomerForm.ui.zip.text() == "":
                errorMsgs.append("Det finns inget postnummer på den nya kunden")

        if len(errorMsgs) != 0:
            errWidget = QErrorMessage(self)
            errWidget.showMessage("<br/>".join(errorMsgs))
            return False
        return True

    @pyqtSlot()
    def on_zeroButton_clicked(self):
        self.reinitUI()

    @pyqtSlot()
    def on_editBillButton_clicked(self):
        self.ui.tabWidget.setCurrentIndex(0)
        self.reinitUI()
        billId = self.__getBillidFromHistory()
        if billId == -1:
            return
        bill = self.getBillData(billId)
        self.poulateBillData(bill)
        self.edit_bill_id = billId
        self.ui.saveGenerateButton.setText("Uppdatera")


    def poulateBillData(self, bill):
        """"""
        self.ui.customerChooser.setCurrentIndex(bill.customer.id - 1)
        self.ui.referenceField.setText(bill.reference)
        for j in bill.jobs:
            # TODO:  somewhat ugly test
            if self.jobList[-1].ui.description.text() != "":
                self.on_addJobButton_clicked()
            job = self.jobList[-1]
            job.ui.description.setText(j.text)
            job.ui.number.setText(str(j.number))
            job.ui.price.setText(str(j.price))


    def reinitUI(self):
        self.edit_bill_id = 0
        self.ui.saveGenerateButton.setText("Generera")
        numberOfJobs = len(self.jobList)
        for i in range(numberOfJobs):
            self.removeJobWidget()
        self.on_addJobButton_clicked()
        self.ui.referenceField.clear()
        self.hideNewCustomer()


    @pyqtSlot()
    def on_saveGenerateButton_clicked(self):
        if not self.validateForSubmit():
            return
        query = QSqlQuery()

        if self.newCustomerActivated:
            name = self.newCustomerForm.ui.name.text()
            address = self.newCustomerForm.ui.address.text()
            zip = self.newCustomerForm.ui.zip.text()
            customer = self.newCustomer(name, address, zip)
        else:
            customerId = self.ui.customerChooser.currentIndex() + 1
            query.exec_('select id, name,address, zipcode from customer where id=' + str(customerId))
            query.next()
            customer = self.extractCustomer(query)

        customerId = customer.id
        reference = self.ui.referenceField.text()
        if self.edit_bill_id == 0:
            bill = self.newBill(reference, customerId)
        else:
            bill = self.updateBill(self.edit_bill_id, reference, customerId)
        bill.setCustomer(customer)
        for j in self.jobList:
            text = j.ui.description.text()
            price = float(j.ui.price.text().replace(",", "."))
            number = int(j.ui.number.text())
            job = self.newJob(price, number, text, bill.id)
            bill.addJob(job)

        # kodduplikat, lägg ut i fun
        pdf = pdflib.BillGenerator(bill)
        fileName = pdf.generate()
        self.reinitUI()
        self.updateHistoryTable()
        self.populateCustomers()
        pwd = os.getcwd()
        webbrowser.open(os.path.join(pwd, fileName))


    def removeJobWidget(self):
        job = self.jobList[-1]
        job.hide()
        self.ui.jobsLayout.removeWidget(job)
        QApplication.processEvents()
        print("before" + str(len(self.jobList)))
        self.jobList.remove(job)
        print("after" + str(len(self.jobList)))


    @pyqtSlot()
    def on_addJobButton_clicked(self):
        job = JobForm()
        self.ui.jobsLayout.addWidget(job)
        self.jobList.append(job)
        QApplication.processEvents()


    @pyqtSlot()
    def on_removeJobButton_clicked(self):
        if len(self.jobList) == 1:
            return
        self.removeJobWidget()


    @pyqtSlot()
    def on_maculateButton_clicked(self):
        """"""
        billId = self.__getBillidFromHistory()
        if billId == -1:
            return

        self.deleteBill(billId)
        self.updateHistoryTable()


    def __getBillidFromHistory(self):
        idx = self.ui.tableView.selectionModel().currentIndex()
        if idx.row() == -1:
            return -1

        model = self.ui.tableView.model()
        idx = model.index(idx.row(), 0)
        billId = int(model.data(idx))
        return billId

    @pyqtSlot()
    def on_generateButton_clicked(self):
        billId = self.__getBillidFromHistory()
        if billId == -1:
            return
        bill = self.getBillData(billId)
        pdf = pdflib.BillGenerator(bill)

        fileName = pdf.generate()
        pwd = os.getcwd()
        webbrowser.open(os.path.join(pwd, fileName))

    def showNewCustomer(self):
        if not self.newCustomerActivated:
            self.ui.customerChooser.setEnabled(False)
            self.newCustomerActivated = True
            self.newCustomerForm.show()
            self.ui.newCustomerButton.setText("Ångra")

    def hideNewCustomer(self):
        if self.newCustomerActivated:
            self.ui.customerChooser.setEnabled(True)
            self.newCustomerActivated = False
            self.newCustomerForm.hide()
            self.ui.newCustomerButton.setText("Ny")

    @pyqtSlot()
    def on_newCustomerButton_clicked(self):
        if self.newCustomerActivated:
            self.hideNewCustomer()
        else:
            self.showNewCustomer()

    def extractBill(self, query):
        id = query.value(0)
        date = query.value(3)
        ref = query.value(2)
        return model.Bill(id, ref, date)


    def extractCustomer(self, query):
        id = query.value(0)
        name = query.value(1)
        address = query.value(2)
        zipcode = query.value(3)
        return model.Customer(id, name, address, zipcode)


    ## TODO: hours or number !
    def extractJobs(self, query):
        """"""
        result = []
        while (query.next()):
            price = query.value(1)
            hours = query.value(0)
            text = query.value(2)
            result.append(model.Job(price, hours, text))

        return result

    def getBillData(self, billId):
        # TODO: handle if no record show up
        query = QSqlQuery()

        query.exec_('select id, c_id, reference, bill_date from bill where id =' + str(billId))
        query.next()

        bill = self.extractBill(query)
        c_id = query.value(1)

        query.exec_('select id, name,address, zipcode from customer where id =' + str(c_id))
        query.next()
        customer = self.extractCustomer(query)
        bill.setCustomer(customer)

        query.exec_('select hours, price,job from jobs where b_id =' + str(bill.id))
        jobs = self.extractJobs(query)
        for j in jobs:
            bill.addJob(j)
        return bill


    def deleteBill(self, billId):
        """"""
        query = QSqlQuery()
        if not query.exec_('delete from bill where id =' + str(billId)):
            print("Det gick inte sa bra")


    def updateHistoryTable(self):
        """"""
        historyModel = QSqlQueryModel()
        self.initializeHistoryModel(historyModel)
        self.ui.tableView.setModel(historyModel)


    def initializeHistoryModel(self, model):
        model.setQuery('select id,reference,bill_date,payed,payed_date from bill')
        model.setHeaderData(0, Qt.Horizontal, "ID")
        model.setHeaderData(1, Qt.Horizontal, "Namn")
        model.setHeaderData(2, Qt.Horizontal, "Fakturan skapad")
        model.setHeaderData(3, Qt.Horizontal, "Betald")
        model.setHeaderData(4, Qt.Horizontal, "Betald Datum")