#!/usr/bin/env escript
-mode(compile).

%% public
main([]) ->
	bert_to_bert2("./priv/bertconfs/*/*.bert");
main(Wildcard) ->
    bert_to_bert2(Wildcard).

%% private
bert_to_bert2(Wildcard) ->
    lists:foreach(fun (Filename) ->
        Tables = read_file(Filename),
        Path = filename:dirname(Filename),
        lists:foreach(fun ({Table, Terms}) ->
            write_file(filename(Path, Table), Terms)
        end, Tables)
    end, filelib:wildcard(Wildcard)).

encode_varint(I) ->
    encode_varint(I, []).

encode_varint(I, Acc) when I =< 16#7f ->
    lists:reverse([I | Acc]);
encode_varint(I, Acc) ->
    LastSevenBits = (I - ((I bsr 7) bsl 7)),
    OtherBits = (I bsr 7),
    NewBit = LastSevenBits bor 16#80,
    encode_varint(OtherBits, [NewBit | Acc]).

filename(Path, Table) ->
    Path ++ "/" ++ atom_to_list(Table) ++ ".bert2".

read_file(Filename) ->
    {ok, File} = file:read_file(Filename),
    binary_to_term(File).

write_file(Filename, Terms) ->
    {ok, File} = file:open(Filename, [raw, write]),
    [write_line(File, Term) || Term <- Terms],
    file:close(File).

write_line(File, Term) ->
    Bin = term_to_binary(Term),
    file:write(File, [encode_varint(size(Bin)), Bin]).