class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Database Program")

        self.setStyleSheet(css)
        
        #Create Actions
        self.display_member = QAction("Display Member",self)
        self.display_parent = QAction("Display Parent",self)
        self.display_invoices = QAction("Display Invoices",self)
        self.add_member = QAction("Add Member",self)
        self.edit_member = QAction("Edit Member",self)
        self.delete_member = QAction("Delete Member",self)
        self.add_parent = QAction("Add Parent",self)
        self.edit_parent = QAction("Edit Parent",self)
        self.delete_parent = QAction("Delete Parent",self)
        self.manage_invoices = QAction("Manage Invoices",self)
        self.print_invoices = QAction("Print Invoices",self)
        self.email_invoices = QAction("Email Invoices",self)
        self.report_invoice = QAction("Report Invoice",self)
        

        #Create the menu bar
        self.menu_bar = QMenuBar()
        self.database_toolbar = QToolBar()
        self.manage_data_toolbar = QToolBar()
        self.send_invoices_toolbar = QToolBar()
        self.reports_toolbar = QToolBar()
        self.display_database_menu = self.menu_bar.addMenu("Display Database")
        self.manage_data_menu = self.menu_bar.addMenu("Manage Data")
        self.send_invoices_menu = self.menu_bar.addMenu("Send Invoices")
        self.reports_menu = self.menu_bar.addMenu("Reports")
        

        #Create toolbar
        self.display_database_menu.addAction(self.display_member)
        self.display_database_menu.addAction(self.display_parent)
        self.display_database_menu.addAction(self.display_invoices)
        self.manage_data_menu.addAction(self.add_member)
        self.manage_data_menu.addAction(self.edit_member)
        self.manage_data_menu.addAction(self.delete_member)
        self.manage_data_menu.addAction(self.add_parent)
        self.manage_data_menu.addAction(self.edit_parent)
        self.manage_data_menu.addAction(self.delete_parent)
        self.manage_data_menu.addAction(self.manage_invoices)
        self.send_invoices_menu.addAction(self.print_invoices)
        self.send_invoices_menu.addAction(self.email_invoices)
        self.reports_menu.addAction(self.report_invoice)

        #Add toolbars to window
        self.database_toolbar.addAction(self.display_member)
        self.database_toolbar.addAction(self.display_parent)
        self.database_toolbar.addAction(self.display_invoices)
        self.manage_data_toolbar.addAction(self.add_member)
        self.manage_data_toolbar.addAction(self.edit_member)
        self.manage_data_toolbar.addAction(self.delete_member)
        self.manage_data_toolbar.addAction(self.add_parent)
        self.manage_data_toolbar.addAction(self.edit_parent)
        self.manage_data_toolbar.addAction(self.delete_parent)
        self.manage_data_toolbar.addAction(self.manage_invoices)
        self.send_invoices_toolbar.addAction(self.print_invoices)
        self.send_invoices_toolbar.addAction(self.email_invoices)
        self.reports_toolbar.addAction(self.report_invoice)

        #Add toolbar
        self.addToolBar(self.database_toolbar)
        self.addToolBar(self.manage_data_toolbar)
        self.addToolBar(self.send_invoices_toolbar)
        self.addToolBar(self.reports_toolbar)

        #Set menu bar
        self.setMenuBar(self.menu_bar)

        #Create Connections
        self.display_member.triggered.connect(self.show_member)
        self.display_parent.triggered.connect(self.show_parent)
        self.display_invoices.triggered.connect(self.show_invoice)
        self.add_member.triggered.connect(self.add_member_data)
        self.edit_member.triggered.connect(self.edit_member_data)
        self.delete_member.triggered.connect(self.delete_member_data)
        self.add_parent.triggered.connect(self.add_parent_data)
        self.edit_parent.triggered.connect(self.edit_parent_data)
        self.delete_parent.triggered.connect(self.delete_parent_data)
        self.manage_invoices.triggered.connect(self.manage_invoice_data)
        self.print_invoices.triggered.connect(self.print_invoice_data)
        self.email_invoices.triggered.connect(self.email_invoice_data)
        self.report_invoice.triggered.connect(self.report_invoice_data)

        #Resizing
        self.resize(1200,800)

        #Opening Database
        self.open_database()
        self.show_member()

        self.show_login()
        #self.create_file()
        #self.show()
        #self.raise_()
        
    def show_login(self):
        self.loginscreen = LoginScreen()
        self.loginscreen.show()

        self.loginscreen.accept_button.clicked.connect(self.login)

    def create_file(self):
        user = User()
        user.username = "******"
        user.password = "******"
        with open("user.dat",mode="wb") as my_file:
            pickle.dump(user,my_file)
    
    def login(self):
        with open("user.dat",mode="rb") as my_file:
            user = pickle.load(my_file)
            
        if self.loginscreen.username.text() == user.username and self.loginscreen.password.text() == user.password:
            print("Valid")
            window.show()
            window.raise_()
            self.loginscreen.close()
        elif self.loginscreen.username.text() == user.username and self.loginscreen.password.text() != user.password:
            self.incorrect_screen = IncorrectDetails()
            self.incorrect_screen.incorrect_password()
        elif self.loginscreen.username.text() != user.username and self.loginscreen.password.text() == user.password:
            self.incorrect_screen = IncorrectDetails()
            self.incorrect_screen.incorrect_username()
        else:
            self.incorrect_screen = IncorrectDetails()
            self.incorrect_screen.incorrect_username_and_password()
        
    def open_database(self):
        path = "scout_database.db"
        print("Path: ",path)
        self.connection = SQLConnection(path)
        ok = self.connection.open_database()
        print("Opened Ok: ",ok)


    def show_member_table(self):
        if not hasattr(self,"display_widget"):
            self.display_widget = DisplayWidget()
        self.display_widget.show_table("Member")

    def show_parent_table(self):
        if not hasattr(self,"display_widget"):
            self.display_widget = DisplayWidget()
        self.display_widget.show_table("Parent")

    def show_invoice_table(self):
        if not hasattr(self,"display_widget"):
            self.display_widget = DisplayWidget()
        self.display_widget.show_table("Invoice")

    def show_invoice_query(self):
        if not hasattr(self,"display_widget"):
            self.display_widget = DisplayWidget()
        query = self.connection.show_invoices()
        self.display_widget.show_results(query)
    
    def show_invoice_relationships(self):
        if not hasattr(self,"display_widget"):
            self.display_widget = DisplayWidget()   
        self.display_widget.show_relationship_invoice_table()
        self.setCentralWidget(self.display_widget)
        




    def show_member(self):
        if not hasattr(self,"display_widget"):
            self.display_widget = DisplayWidget()
        
        query = self.connection.show_members()
        self.display_widget.show_results(query)

        self.search_widget = SearchWidgetMembers()
        self.search_widget.order_combobox.currentIndexChanged.connect(self.search_member)
        
        self.main_layout = QVBoxLayout()
        self.main_widget = QWidget()

        self.title = QLabel("Member Table")
        self.title.setAlignment(Qt.AlignCenter)
        self.title.setObjectName('title')

        self.main_layout.addWidget(self.title)
        self.main_layout.addWidget(self.search_widget)
        self.main_layout.addWidget(self.display_widget)

        self.main_widget.setLayout(self.main_layout)
        
        self.setCentralWidget(self.main_widget)

        
    def search_member(self):
        index = self.search_widget.order_combobox.currentIndex()
        if index == 0:
            query = self.connection.show_members()
        if index == 1:
            query = self.connection.order_member_data("MemberDateOfBirth","ASC")
        if index == 2:
            query = self.connection.order_member_data("MemberFirstName","ASC")
        if index == 3:
            query = self.connection.order_member_data("MemberFirstName","DESC")
        if index == 4:
            query = self.connection.order_member_data("MemberLastName","ASC")
        if index == 5:
            query = self.connection.order_member_data("MemberLastName","DESC")
        if index == 6:
            query = self.connection.order_member_data("MemberTownName","ASC")
        if index == 7:
            query = self.connection.order_member_data("MemberTownName","DESC")
        self.display_widget.model.setQuery(query)
        self.display_widget.results_table.show()

    def show_parent(self):
        if not hasattr(self,"display_widget"):
            self.display_widget = DisplayWidget()
        
        query = self.connection.show_parents()
        self.display_widget.show_results(query)

        self.search_widget = SearchWidgetParents()
        self.search_widget.order_combobox.currentIndexChanged.connect(self.search_parent)
        
        self.main_layout = QVBoxLayout()
        self.main_widget = QWidget()

        self.title = QLabel("Parent Table")
        self.title.setAlignment(Qt.AlignCenter)
        self.title.setObjectName('title')

        self.main_layout.addWidget(self.title)
        self.main_layout.addWidget(self.search_widget)
        self.main_layout.addWidget(self.display_widget)

        self.main_widget.setLayout(self.main_layout)
        
        self.setCentralWidget(self.main_widget)

    def search_parent(self):
        index = self.search_widget.order_combobox.currentIndex()
        if index == 0:
            query = self.connection.show_parents()
        if index == 1:
            query = self.connection.order_parent_data("ParentFirstName","ASC")
        if index == 2:
            query = self.connection.order_parent_data("ParentFirstName","DESC")
        if index == 3:
            query = self.connection.order_parent_data("ParentLastName","ASC")
        if index == 4:
            query = self.connection.order_parent_data("ParentLastName","DESC")
        if index == 5:
            query = self.connection.order_parent_data("ParentTownName","ASC")
        if index == 6:
            query = self.connection.order_parent_data("ParentTownName","DESC")
        self.display_widget.model.setQuery(query)
        self.display_widget.results_table.show()

    def show_invoice(self):
        if not hasattr(self,"display_widget"):
            self.display_widget = DisplayWidget()
        
        query = self.connection.show_invoices()
        self.display_widget.show_results(query)

        self.search_widget = SearchWidgetInvoice()
        self.search_widget.order_combobox.currentIndexChanged.connect(self.search_invoice)
        
        self.main_layout = QVBoxLayout()
        self.main_widget = QWidget()

        self.title = QLabel("Invoice Table")
        self.title.setAlignment(Qt.AlignCenter)
        self.title.setObjectName('title')

        self.main_layout.addWidget(self.title)
        self.main_layout.addWidget(self.search_widget)
        self.main_layout.addWidget(self.display_widget)

        self.main_widget.setLayout(self.main_layout)
        
        self.setCentralWidget(self.main_widget)

    def search_invoice(self):
        index = self.search_widget.order_combobox.currentIndex()
        if index == 0:
            query = self.connection.show_invoices()
        if index == 1:
            query = self.connection.order_invoice_data("DateInvoiceWasSent","ASC")
        if index == 2:
            query = self.connection.order_invoice_data("ParentFirstName","ASC")
        if index == 3:
            query = self.connection.order_invoice_data("ParentFirstName","DESC")
        if index == 4:
            query = self.connection.order_invoice_data("ParentLastName","ASC")
        if index == 5:
            query = self.connection.order_invoice_data("ParentLastName","DESC")
        if index == 6:
            query = self.connection.order_invoice_data("WasInvoicePaid","ASC")
        self.display_widget.model.setQuery(query)
        self.display_widget.results_table.show()

        
    def add_member_data(self):
        self.show_member_table()

        self.data_dialog = EnterMemberDataDialog()
        self.data_dialog.updatedData.connect(self.display_widget.refresh)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.display_widget)
        self.layout.addWidget(self.data_dialog)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.setCentralWidget(self.main_widget)
        

    def edit_member_data(self):        
        self.show_member_table()

        self.search_dialog = SearchDialog()
        
        self.search_dialog.updatedData.connect(self.return_searched_data_member)

        self.label = QLabel("Click on a field to edit it.")
        self.label.setAlignment(Qt.AlignCenter)
        
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.search_dialog)
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.display_widget)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.setCentralWidget(self.main_widget)

    def return_searched_data_member(self):
        text = self.search_dialog.search_for_member.text()
        filter_query = "MemberFirstName like '%{0}%' or MemberLastName like '%{0}%'".format(text)
        self.display_widget.model.setFilter(filter_query)
        self.display_widget.model.select()
        self.display_widget.results_table.setModel(self.display_widget.model)
        
    def delete_member_data(self):
        self.show_member_table()

        self.search_dialog = SearchDialog()
        self.search_dialog.updatedData.connect(self.return_searched_data_member)

        self.display_widget.results_table.doubleClicked.connect(self.delete_row_clicked)

        self.label = QLabel("Double click a row to delete.")
        self.label.setAlignment(Qt.AlignCenter)


        self.layout = QVBoxLayout()
        self.layout.addWidget(self.search_dialog)
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.display_widget)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.setCentralWidget(self.main_widget)
        
    
    def add_parent_data(self):
        self.show_parent_table()

        self.data_dialog = EnterParentDataDialog()
        self.data_dialog.updatedData.connect(self.display_widget.refresh)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.display_widget)
        self.layout.addWidget(self.data_dialog)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.setCentralWidget(self.main_widget)

    def edit_parent_data(self):        
        self.show_parent_table()
        
        self.search_dialog = SearchDialogParent()
        
        self.search_dialog.updatedData.connect(self.return_searched_data_parent)

        self.label = QLabel("Click on a field to edit it.")
        self.label.setAlignment(Qt.AlignCenter)
        
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.search_dialog)
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.display_widget)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.setCentralWidget(self.main_widget)


    def return_searched_data_parent(self):
        text = self.search_dialog.search_for_member.text()
        filter_query = "ParentFirstName like '%{0}%' or ParentLastName like '%{0}%'".format(text)
        self.display_widget.model.setFilter(filter_query)
        self.display_widget.model.select()
        self.display_widget.results_table.setModel(self.display_widget.model)

    
    def delete_parent_data(self):
        self.show_parent_table()

        self.search_dialog = SearchDialogParent()
        self.search_dialog.updatedData.connect(self.return_searched_data_parent)

        self.display_widget.results_table.doubleClicked.connect(self.delete_row_clicked)

        self.label = QLabel("Double click a row to delete.")
        self.label.setAlignment(Qt.AlignCenter)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.search_dialog)
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.display_widget)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.setCentralWidget(self.main_widget)

    def manage_invoice_data(self):
        self.show_invoice_table()

        self.display_widget_2 = DisplayWidget()
        self.display_widget_2.show_table("Parent")

        self.choose_button = ChooseOption()
        self.data_dialog = EnterInvoiceData()
        self.choose_button.addData.connect(self.add_invoice_data)
        self.choose_button.deleteData.connect(self.delete_invoice_data)

        self.label_layout = QHBoxLayout()
        self.parent_label = QLabel("Parent Table")
        self.parent_label.setAlignment(Qt.AlignCenter)
        self.invoice_label = QLabel("Invoice Table")
        self.invoice_label.setAlignment(Qt.AlignCenter)
        self.label_layout.addWidget(self.parent_label)
        self.label_layout.addWidget(self.invoice_label)
        self.label_widget = QWidget()
        self.label_widget.setLayout(self.label_layout)
        
        self.table_layout = QHBoxLayout()
        self.layout = QVBoxLayout()
        self.tables = QWidget()
        self.table_layout.addWidget(self.display_widget_2)
        self.table_layout.addWidget(self.display_widget)
        self.tables.setLayout(self.table_layout)
        self.layout.addWidget(self.label_widget)
        self.layout.addWidget(self.tables)
        self.layout.addWidget(self.choose_button)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.setCentralWidget(self.main_widget)

    def delete_invoice_data(self):
        self.show_invoice_query()

        self.search_dialog = SearchDialogParent()
        self.search_dialog.updatedData.connect(self.return_searched_data_parent)

        self.display_widget.results_table.doubleClicked.connect(self.delete_row_clicked)

        self.label = QLabel("Double click a row to delete.")
        self.label.setAlignment(Qt.AlignCenter)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.search_dialog)
        self.layout.addWidget(self.label)
        self.layout.addWidget(self.display_widget)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.setCentralWidget(self.main_widget)

    def delete_row_clicked(self):
        row = self.display_widget.results_table.selectedIndexes()[0].row()
        self.display_widget.model.removeRow(row)

    def add_invoice_data(self):
        self.show_invoice_table()

        self.data_dialog = EnterInvoiceData()
        self.data_dialog.updatedData.connect(self.add_invoice_data)

        self.table_layout = QHBoxLayout()
        self.layout = QVBoxLayout()
        self.tables = QWidget()
        self.table_layout.addWidget(self.display_widget_2)
        self.table_layout.addWidget(self.display_widget)
        self.tables.setLayout(self.table_layout)
        self.layout.addWidget(self.tables)
        self.layout.addWidget(self.data_dialog)
        self.main_widget = QWidget()
        self.main_widget.setLayout(self.layout)
        self.setCentralWidget(self.main_widget)

    def print_invoice_data(self):
        invoice = SendInvoiceData()
        invoice.print_preview()

    def report_invoice_data(self):
        if not hasattr(self,"display_widget"):
            self.display_widget = DisplayWidget()
        self.setCentralWidget(self.display_widget)
        query = self.connection.report_invoices()
        self.display_widget.show_results(query)

    def email_invoice_data(self):
        invoice = EmailInvoice()
        invoice.exec_()
        values = invoice.return_values()
        print(values)
        invoice.email_document(values[0],values[1],values[2],values[3])