const std = @import("std");

const Config = @This();

elevation_mask: f64 = 19,
rotctld: AddressPort = .{ .address = "127.0.0.1", .port = 4533 },
listen: AddressPort = .{ .address = "127.0.0.1", .port = 42069 },

const confdir = "rotint";
const conffile = "config.json";

pub fn default() Config {
    return .{};
}

pub fn load(allocator: std.mem.Allocator, env: *const std.process.EnvMap) !Config {
    if (env.get("XDG_CONFIG_HOME")) |cfg|
        if (cfg.len > 0) {
            return try loadPath(allocator, try std.fs.path.join(
                allocator,
                &.{ cfg, confdir, conffile },
            ));
        };

    if (env.get("HOME")) |home|
        if (home.len > 0) {
            return try loadPath(allocator, try std.fs.path.join(
                allocator,
                &.{ home, ".config", confdir, conffile },
            ));
        };

    return error.ConfigHomeMissing;
}

fn loadPath(allocator: std.mem.Allocator, path: []const u8) !Config {
    defer allocator.free(path);
    const data = try std.fs.cwd().readFileAlloc(allocator, path, 1024);
    defer allocator.free(data);

    return try std.json.parseFromSliceLeaky(Config, allocator, data, .{});
}

const AddressPort = struct {
    address: []const u8,
    port: u16,
};
