#!/usr/bin/env escript
%%! -sname admin@localhost
%%
%% Holger Weiss <holger@zedat.fu-berlin.de>, December 2018.

-define(NODE, 'ejabberd@localhost'). % Adjust if necessary.

-mode(compile).

-spec main([string()]) -> any().
main(_Args) ->
    case rpc:call(?NODE, ejabberd_config, get_myhosts, []) of
        Hosts when is_list(Hosts) ->
            lists:foreach(fun export_host/1, Hosts);
        {badrpc, Err} ->
            io:fwrite(standard_error, "Cannot get list of XMPP domains: ~p~n",
                      [Err])
    end.

-spec export_host(binary()) -> any().
export_host(Host) ->
    case rpc:call(?NODE, ejabberd_auth, get_users, [Host]) of
        Users when is_list(Users) ->
            io:fwrite("[~s] Exporting bookmarks for ~s.~n", [ts(), Host]),
            lists:foreach(fun export_user/1, Users),
            io:fwrite("[~s] Exported bookmarks for ~s: ~B users~n",
                      [ts(), Host, length(Users)]);
        {badrpc, Err} ->
            io:fwrite(standard_error, "Cannot get list of ~s users: ~p~n",
                      [Host, Err])
    end.

-spec export_user({binary(), binary()}) -> any().
export_user({User, Server}) ->
    case rpc:call(?NODE, mod_private, bookmarks_to_pep, [User, Server]) of
        {ok, _} ->
            ok;
        {error, Err} ->
            io:fwrite(standard_error, "Cannot export bookmarks of ~s@~s: ~s~n",
                      [User, Server, Err]);
        {badrpc, Err} ->
            io:fwrite(standard_error, "Cannot export bookmarks of ~s@~s: ~p~n",
                      [User, Server, Err])
    end.

-spec ts() -> [char()].
ts() ->
    {{YY, MM, DD}, {Hh, Mm, Ss}} = calendar:local_time(),
    io_lib:format("~B-~2..0B-~2..0B ~2..0B:~2..0B:~2..0B",
                  [YY, MM, DD, Hh, Mm, Ss]).
