% Licensed under the Apache License, Version 2.0 (the "License"); you may not
% use this file except in compliance with the License. You may obtain a copy of
% the License at
%
% http://www.apache.org/licenses/LICENSE-2.0
%
% Unless required by applicable law or agreed to in writing, software
% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
% License for the specific language governing permissions and limitations under
% the License.

-module(mango_sort).

-export([
    new/1,
    to_json/1,
    fields/1,
    directions/1
]).


-include("mango.hrl").


new(Fields) when is_list(Fields) ->
    Sort = {[sort_field(Field) || Field <- Fields]},
    validate(Sort),
    {ok, Sort};
new(Else) ->
    ?MANGO_ERROR({invalid_sort_json, Else}).


to_json({Fields}) ->
    to_json(Fields);
to_json([]) ->
    [];
to_json([{Name, Dir} | Rest]) ->
    [{[{Name, Dir}]} | to_json(Rest)].


fields({Props}) ->
    [Name || {Name, _Dir} <- Props].


directions({Props}) ->
    [Dir || {_Name, Dir} <- Props].


sort_field(Field) when is_binary(Field) ->
    {Field, <<"asc">>};
sort_field({[{Name, <<"asc">>}]}) when is_binary(Name) ->
    {Name, <<"asc">>};
sort_field({[{Name, <<"desc">>}]}) when is_binary(Name) ->
    {Name, <<"desc">>};
sort_field({Name, BadDir}) when is_binary(Name) ->
    ?MANGO_ERROR({invalid_sort_dir, BadDir});
sort_field(Else) ->
    ?MANGO_ERROR({invalid_sort_field, Else}).


validate({Props}) ->
    % Assert each field is in the same direction
    % until we support mixed direction sorts.
    Dirs = [D || {_, D} <- Props],
    case lists:usort(Dirs) of
        [] ->
            ok;
        [_] ->
            ok;
        _ ->
            ?MANGO_ERROR({unsupported, mixed_sort})
    end.
