const std = @import("std");
const fs = std.fs;
const lib = @import("./lib.zig");

// WON'T: human output => use human command instead
// TODO: error management.
// TODO: verbose output (-l).

pub const cwd = fs.cwd();

// Either print directory's content or file.
fn print_element(path: []const u8) !void {
    var dir: fs.Dir = cwd.openDir(path, .{.iterate = true}) catch |err| switch (err) {
        error.NotDir => return lib.print("{s}\n", .{path}),
        else => return err,
    };
    var dir_it = dir.iterate();

    while (try dir_it.next()) |entry| {
        lib.print("{s}\n", .{entry.name});
    }
}

pub fn ls() !void {
    var cli = try lib.CLI.init();
    defer cli.deinit();

    // Skipping the executable binary name.
    var arg_idx: usize = 1;

    // case there are parameters
    while(arg_idx < cli.args.len) {
        const element = cli.nextArg(&arg_idx) orelse {
            lib.warn("Null argument\n", .{});
            return error.InvalidArgs;
        };
        try print_element(element);
    }

    // case there were no parameter, print current directory
    if (cli.args.len == 1) {
        try print_element(".");
    }
}

pub fn main() !void {
    try ls();
}