#!/usr/bin/env python
# vim:fileencoding=utf-8:noet
from __future__ import (unicode_literals, division, absolute_import, print_function)

import time
import re
import subprocess

from threading import Lock, Timer

from powerline.lemonbar import LemonbarPowerline
from powerline.commands.lemonbar import get_argparser
from powerline.bindings.wm import get_connected_xrandr_outputs


if __name__ == '__main__':
	parser = get_argparser()
	args = parser.parse_args()

	powerline = LemonbarPowerline()
	powerline.update_renderer()
	bars = []

	for screen in get_connected_xrandr_outputs(powerline.pl):
		command = [args.bar_command, '-g', '{0}x{1}+{2}+{3}'.format(screen['width'], args.height, screen['x'], screen['y'])] + args.args[1:]
		process = subprocess.Popen(command, stdin=subprocess.PIPE)
		bars.append((screen['name'], process, int(screen['width']) / 5))

	lock = Lock()
	modes = ['default']

	def render(reschedule=False):
		if reschedule:
			Timer(args.interval, render, kwargs={'reschedule': True}).start()

		global lock
		with lock:
			for output, process, width in bars:
				process.stdin.write(powerline.render(mode=modes[0], width=width, matcher_info=output).encode('utf-8') + b'\n')
				process.stdin.flush()

	def update(evt):
		modes[0] = evt.change
		render()

	render(reschedule=True)

	if args.i3:
		try:
			import i3ipc
		except ImportError:
			import i3
			i3.Subscription(lambda evt, data, sub: render(), 'workspace')
		else:
			conn = i3ipc.Connection()
			conn.on('workspace::focus', lambda conn, evt: render())
			conn.on('mode', lambda conn, evt: update(evt))
			conn.main()

	while True:
		time.sleep(1e8)
