%% The filesystem half of albedo/daemon/folders: directory entries and stats,
%% following symlinks the way a shell's `cd` would.
-module(albedo_folders).

-export([home/0, entries/1, file_size/1]).

-include_lib("kernel/include/file.hrl").

home() ->
    case os:getenv("HOME") of
        false -> <<"/">>;
        Home -> unicode:characters_to_binary(Home)
    end.

%% Every entry of Dir as the gleam Entry record, none when it cannot be
%% read. A name that is not valid UTF-8 cannot be shown or passed back, so
%% it is left out.
entries(Dir) ->
    case file:list_dir(Dir) of
        {ok, Names} -> [entry(Dir, Name) || Name <- Names, is_list(Name)];
        {error, _} -> []
    end.

entry(Dir, Name0) ->
    Name = unicode:characters_to_binary(Name0),
    case file:read_file_info(filename:join(Dir, Name), [{time, posix}]) of
        {ok, #file_info{type = Type, mtime = Mtime}} ->
            {entry, Name, Type =:= directory, Mtime};
        {error, _} ->
            {entry, Name, false, 0}
    end.

file_size(Path) ->
    case file:read_file_info(Path) of
        {ok, #file_info{type = regular, size = Size}} -> {ok, Size};
        _ -> {error, nil}
    end.
