const std = @import("std");
const io = std.io;
const heap = std.heap;
const json = std.json;

const battery = @import("modules/battery.zig");
const calendar = @import("modules/calendar.zig");
const display = @import("modules/display.zig");
const uptime = @import("modules/uptime.zig");
const Module = @import("module.zig");

pub fn main() !void {
    var arena = heap.ArenaAllocator.init(heap.page_allocator);
    defer arena.deinit();

    const stdout_file = std.io.getStdOut().writer();
    var bw = std.io.bufferedWriter(stdout_file);
    const stdout = bw.writer();

    try stdout.print("{{\"version\":1}}\n[\n", .{});
    try bw.flush();

    var _display = display.init(arena.allocator());
    var _battery = battery.init(arena.allocator());
    var _calendar = calendar.init(arena.allocator());
    var modules = [_]Module{
        _display.module,
        _battery.module,
        _calendar.module,
    };

    while (true) {
        try stdout.print("[", .{});
        for (modules) |module| {
            try json.stringify(try module.getJson(), .{ .emit_null_optional_fields = false }, stdout);
            try stdout.print(",", .{});
        }
        // try stdout.print("[", .{});
        // try json.stringify(battery_json, .{ .emit_null_optional_fields = false }, stdout);
        // try stdout.print(",", .{});
        // try json.stringify(calendar_json, .{ .emit_null_optional_fields = false }, stdout);
        // try stdout.print(",", .{});
        // try stdout.print("{{\"full_text\":\"test\"}}", .{});
        try stdout.print("],\n", .{});

        try bw.flush();
        _ = arena.reset(.retain_capacity);
        std.time.sleep(1000_000_000);
    }
}