#!/usr/bin/env python3

"""
Logs what window is in focus
"""

import csv
import datetime
import os
import typing

import i3ipc


class ScreenTime:
    FIELDS = ["date", "type", "class", "role", "instance", "title"]

    def write(self, line: typing.Dict) -> None:
        now = datetime.datetime.now()
        line["date"] = now.timestamp()

        print("WROTE", line)
        with open(self.csv_path, "a") as typedfd:
            writer = csv.DictWriter(typedfd, fieldnames=self.FIELDS)
            writer.writerow(line)

    def on_window_event(
        self, _: i3ipc.connection.Connection, e: i3ipc.events.WindowEvent
    ) -> None:
        focused = self.i3.get_tree().find_focused()
        self.write(
            {
                "type": "window_" + e.change,
                "class": focused.window_class,
                "role": focused.window_role,
                "title": focused.window_title,
                "instance": focused.window_instance,
            }
        )

    def on_mode_event(
        self, _: i3ipc.connection.Connection, e: i3ipc.events.ModeEvent
    ) -> None:
        self.write({"type": "mode", "title": e.change})

    def __init__(self) -> None:
        self.i3 = i3ipc.Connection()
        self.i3.on(i3ipc.Event.WINDOW, self.on_window_event)
        self.i3.on(i3ipc.Event.MODE, self.on_mode_event)

        self.csv_path = os.path.join(
            os.path.expanduser(os.getenv("XDG_CACHE_PATH", "~/.cache/")),
            "screentime.csv",
        )
        if not os.path.isfile(self.csv_path):
            with open(self.csv_path, "w") as typedfd:
                writer = csv.DictWriter(typedfd, fieldnames=self.FIELDS)
                writer.writeheader()
        self.write({"type": "start"})

    def main(self) -> None:
        self.i3.main()


if __name__ == "__main__":
    ST = ScreenTime()
    ST.main()