class MaintenanceDialog(object):
    """Retrieve main_dlg."""
    def __init__(self, parent):
        self.pkgs = []
        self.apt_client = aptdaemon.client.AptClient()
        self.builder = Gtk.Builder()
        self.builder.add_from_file('maintenance.ui')
        self.builder.connect_signals(self)

        self.main_dlg = self.builder.get_object('main_dlg')
        self.main_dlg_tview = self.builder.get_object('main_dlg_tview')
        self.main_dlg_tstore = self.builder.get_object('main_dlg_tstore')
        self.main_dlg_lbl_title = self.builder.get_object('main_dlg_lbl_title')
        self.main_dlg_lbl_space = self.builder.get_object('main_dlg_lbl_space')
        self.main_dlg_img_lbl = self.builder.get_object('main_dlg_img_lbl')
        self.main_dlg.set_transient_for(parent)
        self.main_dlg.set_default_response(Gtk.ResponseType.CANCEL)

    def populate_treeview(self):
        """AptDeamon Callbacks."""
        tview_pkgs = []
        for ppkg in self.pkgs:
            if ppkg.name.startswith('linux-image'):
                tview_pkgs.append(ppkg)
                desc = '<b>%s</b>\n<small>%s (%s)</small>' % (
                    ppkg.name, ppkg.desc, ppkg.sum)
                size = '%sB' % apt_pkg.size_to_str(ppkg.size)
                piter = self.main_dlg_tstore.append(None, [ppkg, None, desc, size, \
                                                  Gtk.IconSize.LARGE_TOOLBAR, None, None, False])
                for cpkg in ppkg.childs:
                    tview_pkgs.append(cpkg)
                    desc = '<b>%s</b>\n<small>%s (%s)</small>' % (
                        cpkg.name, cpkg.desc, cpkg.sum)
                    size = '%sB' % apt_pkg.size_to_str(cpkg.size)
                    self.main_dlg_tstore.append(piter, [cpkg, None, desc, size, \
                                                Gtk.IconSize.SMALL_TOOLBAR, None, None, False])
        for ppkg in self.pkgs:
            if ppkg not in tview_pkgs:
                desc = '<b>%s</b>\n<small>%s (%s)</small>' % (
                    ppkg.name, ppkg.desc, ppkg.sum)
                size = '%sB' % apt_pkg.size_to_str(ppkg.size)
                piter = self.main_dlg_tstore.append(None, [ppkg, None, desc, size, \
                                                  Gtk.IconSize.LARGE_TOOLBAR, None, None, False])

    def on_reply(self, trans):
        self.main_dlg.hide()
        trans.connect('finished', self.on_trans_finished)
        self.prog_dlg = AptProgressDialog(trans, None, True, False)
        self.prog_dlg.connect('response', self.on_prog_dlg_response)
        self.prog_dlg_cancel = self.prog_dlg.get_action_area().get_children(
        )[0]
        self.prog_dlg.get_action_area().remove(self.prog_dlg_cancel)
        self.prog_dlg.add_button(Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)
        self.prog_dlg.set_response_sensitive(Gtk.ResponseType.CLOSE, False)
        self.prog_dlg.run(False, False, True, lambda: True, self.on_error)

    def on_error(self, error):
        try:
            raise error
        except aptdaemon.errors.NotAuthorizedError:
            # Silently ignore auth failures
            return
        except aptdaemon.errors.TransactionFailed as error:
            pass
        except Exception as error:
            error = aptdaemon.errors.TransactionFailed(ERROR_UNKNOWN,
                                                       str(error))
        self.error_dlg = AptErrorDialog(error, None)
        self.error_dlg.set_title('Σφάλμα')
        self.error_dlg.run()

    def on_trans_finished(self, trans, status):
        self.prog_dlg.expander.terminal.show()
        self.prog_dlg.expander.set_sensitive(True)
        self.prog_dlg.set_response_sensitive(Gtk.ResponseType.CLOSE, True)

    def on_prog_dlg_response(self, prog_dlg, response):
        self.prog_dlg.destroy()
        self.main_dlg.destroy()

    def on_main_dlg_pkg_toggle_toggled(self, widget, path):
        """Callbacks."""
        self.main_dlg_tstore[path][5] = not self.main_dlg_tstore[path][5]
        if not self.main_dlg_tstore[path][5]:
            self.pkgs.remove(self.main_dlg_tstore[path][0])
            for iter in self.main_dlg_tstore[path].iterchildren():
                self.pkgs.remove(iter[0])
                iter[5] = False
        else:
            self.pkgs.append(self.main_dlg_tstore[path][0])
            for iter in self.main_dlg_tstore[path].iterchildren():
                self.pkgs.append(iter[0])
                iter[5] = True
        if len(self.pkgs) != 0:
            self.main_dlg.set_response_sensitive(Gtk.ResponseType.OK, True)
            if len(self.pkgs) == 1:
                self.main_dlg_lbl_space.set_text(
                    '%d πακέτο έχει επιλέγει, %sB χώρου στο δίσκο θα ελευθερωθούν.' \
                 %(len(self.pkgs), apt_pkg.size_to_str(sum(pkg.size for pkg in self.pkgs))))
            else:
                self.main_dlg_lbl_space.set_text(
                    '%d πακέτα έχουν επιλέγει, %sB χώρου στο δίσκο θα ελευθερωθούν.' \
                 %(len(self.pkgs), apt_pkg.size_to_str(sum(pkg.size for pkg in self.pkgs))))
        else:
            self.main_dlg.set_response_sensitive(Gtk.ResponseType.OK, False)
            self.main_dlg_lbl_space.set_text(
                'Δεν έχετε επιλέξει κάποιο πυρήνα προς αφαίρεση.')