#!/usr/bin/env python3

import typing
import subprocess
import time

# CORE


class Notifier:
    pass


class Section:
    def __init__(self) -> None:
        self.text = b"(Loading)"


class Module:
    def __init__(self) -> None:
        self.bar: "Bar"
        self.section = Section()
        self.sections = [self.section]


class Alignment:
    def __init__(self, *modules: Module) -> None:
        self.bar: "Bar"
        self.modules = modules
        for module in modules:
            module.bar = self.bar


class Screen:
    def __init__(self, left: Alignment = Alignment(), right: Alignment = Alignment()) -> None:
        self.bar: "Bar"
        self.left = left
        self.left.bar = self.bar
        self.right = right or Alignment()
        self.right.bar = self.bar


class Bar:
    def __init__(self, *screens: Screen) -> None:
        self.screens = screens
        for screen in screens:
            screen.bar = self
        self.process = subprocess.Popen(["lemonbar"], stdin=subprocess.PIPE)

    def display(self) -> None:
        string = b""
        for s, screen in enumerate(self.screens):
            string += b"%%{S%d}" % s
            for control, alignment in [(b'%{l}', screen.left), (b'%{r}', screen.right)]:
                string += control
                for module in alignment.modules:
                    for section in module.sections:
                        string += b"<%b> |" % section.text

        string += b"\n"
        print(string)
        assert self.process.stdin
        self.process.stdin.write(string)
        self.process.stdin.flush()

    def run(self) -> None:
        while True:
            self.display()
            time.sleep(1)


# REUSABLE

class ClockNotifier(Notifier):
    def run(self) -> None:
        while True:
    def __init__(self, text: bytes):
        super().__init__()
        self.section.text = text

class StaticModule(Module):
    def __init__(self, text: bytes):
        super().__init__()
        self.section.text = text


# USER

if __name__ == "__main__":
    bar = Bar(
        Screen(Alignment(StaticModule(b"A"))),
        Screen(Alignment(StaticModule(b"B"))),
    )
    bar.run()