"""
A tab listing the ad-hoc commands on a specific JID.  The user can
select one of them and start executing it, or just close the tab and do
nothing.
"""

import logging
from typing import Dict, Callable

from poezio.tabs import ListTab
from poezio.core.structs import Command

from slixmpp.plugins.xep_0030.stanza.items import DiscoItem

log = logging.getLogger(__name__)


class AdhocCommandsListTab(ListTab):
    plugin_commands: Dict[str, Command] = {}
    plugin_keys: Dict[str, Callable] = {}

    def __init__(self, core, jid):
        ListTab.__init__(
            self, core, jid.full, "“Enter”: execute selected command.",
            'Ad-hoc commands of JID %s (Loading)' % jid, (('Node', 0),
                                                          ('Description', 1)))
        self.key_func['^M'] = self.execute_selected_command

    def execute_selected_command(self):
        if not self.listview or not self.listview.get_selected_row():
            return
        node, name, jid = self.listview.get_selected_row()
        session = {
            'next': self.core.handler.next_adhoc_step,
            'error': self.core.handler.adhoc_error
        }
        self.core.xmpp.plugin['xep_0050'].start_command(jid, node, session)

    def get_columns_sizes(self):
        return {
            'Node': int(self.width * 3 / 8),
            'Description': int(self.width * 5 / 8)
        }

    def on_list_received(self, iq):
        """
        Fill the listview with the value from the received iq
        """
        if iq['type'] == 'error':
            self.set_error(iq['error']['type'], iq['error']['code'],
                           iq['error']['text'])
            return

        def get_items():
            substanza = iq['disco_items']
            for item in substanza['substanzas']:
                if isinstance(item, DiscoItem):
                    yield item

        items = [(item['node'], item['name'] or '', item['jid'])
                 for item in get_items()]
        self.listview.set_lines(items)
        self.info_header.message = 'Ad-hoc commands of JID %s' % self.name
        if self.core.tabs.current_tab is self:
            self.refresh()
        else:
            self.state = 'highlight'
            self.refresh_tab_win()
        self.core.doupdate()
