#!/usr/bin/env python3

import subprocess
import socket
import sys
import os
import json
import datetime

# Create a UDS socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server_address = os.environ['XDG_RUNTIME_DIR'] + '/leftwm/current_state.sock'
sock.connect(server_address)

read_buffer = ""
def read_socket():
    global read_buffer
    try:
        index = read_buffer.find("\n")
        if index != -1:
            line = read_buffer[0:index]
            read_buffer = read_buffer[index+1:]
            return json.loads(line)
        else:
            read_buffer += sock.recv(1024).decode('utf-8')
            return None
    except json.decoder.JSONDecodeError as err:
        return None

def time():
    return datetime.datetime.now().strftime("%B %d, %Y  %I:%M %p")

def format_for_tag_list(active, focused, displayed ,tags):
    output = ""
    for tag in tags:
        if tag == active:
            if tag in focused:
                output += "%{{F#000000}}%{{B#FFFFFF}}  {}  %{{B-}}%{{F-}}".format(tag)
            else:
                output += "%{{F#000000}}%{{B#aaaaaa}}  {}  %{{B-}}%{{F-}}".format(tag)
        else:
            if tag in displayed:
                output += "%{{F-}}%{{B#444444}}  {}  %{{B-}}%{{F-}}".format(tag)
            else:
                output += '  {}  '.format( tag )

    return output

def format_for_viewport(index, viewport, json):
    focused = json["viewports"][index]["tags"]
    output = "%{l}" + format_for_tag_list( viewport, json["active_desktop"], focused, json["desktop_names"] )
    output += "%{c}" + (json["window_title"] or '')
    output += "%{r}" + time() + '    '
    return '%{{S{}}}'.format( index ) + output

def format(json):
    output = ""
    index = 0
    for port in json["viewports"]:
        output = output + format_for_viewport(index, port, data)
        index += 1
    return '{}\n'.format( output )


bar = subprocess.Popen(['lemonbar','-fDejaVu Sans:size=10' ,'-F#FFFFFFFF', '-B#aa222222', '-p'],
                       stdin=subprocess.PIPE,
                       stdout=subprocess.DEVNULL,
                       stderr=subprocess.DEVNULL,
                       bufsize=1,
                       universal_newlines=True)

while True:
    data = read_socket()
    if data != None:
        formated = format(data)
        bar.stdin.write(formated)



