#!/usr/bin/env python3

from i3dstatus.block import Block

import html
import os
import asyncio

try:
    from i3ipc.aio import Connection
except ImportError as e:
    block.error('could not find python3 module i3ipc')
    raise e

scratchpad_format = 'scratchpad: <b>%classes</b>'

block = Block(os.path.basename(__file__))

last_full_text = ''


async def show_block(i3):
    global last_full_text
    data = {"markup": "pango", "full_text": ""}

    tree = await i3.get_tree()
    scratchpad = tree.scratchpad().leaves()

    if scratchpad:
        classes = []
        has_urgent = False
        urgent_fmt = '<span color="red">{}</span>'

        for l in scratchpad:
            window_class = html.escape(l.window_class)
            if l.urgent:
                has_urgent = True
                classes.append(urgent_fmt.format(window_class))
            else:
                classes.append(window_class)

        full_text = scratchpad_format.replace('%classes', ', '.join(classes))
        if has_urgent:
            full_text = full_text.replace('%count', urgent_fmt.format(len(scratchpad)))
        else:
            full_text = full_text.replace('%count', str(len(scratchpad)))

        data['full_text'] = full_text

    if data['full_text'] != last_full_text:
        last_full_text = data['full_text']
        print(data)
        await block.show(**data)


async def on_move(i3, e):
    await show_block(i3)


async def on_urgent(i3, e):
    await show_block(i3)


async def main():
    global scratchpad_format
    i3 = Connection()

    await asyncio.gather(i3.connect(), block.connect())

    if 'format' in block.config:
        scratchpad_format = block.config['format']

    await show_block(i3)

    i3.on('window::move', on_move)
    i3.on('window::urgent', on_urgent)

    await i3.main()


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
