#!/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()