% 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_json).


-export([
    min/0,
    max/0,
    cmp/2,
    cmp_raw/2,
    type/1,
    special/1,
    to_binary/1
]).


-define(MIN_VAL, mango_json_min).
-define(MAX_VAL, mango_json_max).


min() ->
    ?MIN_VAL.


max() ->
    ?MAX_VAL.


cmp(?MIN_VAL, ?MIN_VAL) ->
    0;
cmp(?MIN_VAL, _) ->
    -1;
cmp(_, ?MIN_VAL) ->
    1;
cmp(?MAX_VAL, ?MAX_VAL) ->
    0;
cmp(?MAX_VAL, _) ->
    1;
cmp(_, ?MAX_VAL) ->
    -1;
cmp(A, B) ->
    couch_ejson_compare:less(A, B).


cmp_raw(?MIN_VAL, ?MIN_VAL) ->
    0;
cmp_raw(?MIN_VAL, _) ->
    -1;
cmp_raw(_, ?MIN_VAL) ->
    1;
cmp_raw(?MAX_VAL, ?MAX_VAL) ->
    0;
cmp_raw(?MAX_VAL, _) ->
    1;
cmp_raw(_, ?MAX_VAL) ->
    -1;
cmp_raw(A, B) ->
    case A < B of
        true ->
            -1;
        false ->
            case A > B of
                true ->
                    1;
                false ->
                    0
            end
    end.


type(null) ->
    <<"null">>;
type(Bool) when is_boolean(Bool) ->
    <<"boolean">>;
type(Num) when is_number(Num) ->
    <<"number">>;
type(Str) when is_binary(Str) ->
    <<"string">>;
type({Props}) when is_list(Props) ->
    <<"object">>;
type(Vals) when is_list(Vals) ->
    <<"array">>.


special(?MIN_VAL) ->
    true;
special(?MAX_VAL) ->
    true;
special(_) ->
    false.


to_binary({Props}) ->
    Pred = fun({Key, Value}) ->
        {to_binary(Key), to_binary(Value)}
    end,
    {lists:map(Pred, Props)};
to_binary(Data) when is_list(Data) ->
    [to_binary(D) || D <- Data];
to_binary(null) ->
    null;
to_binary(true) ->
    true;
to_binary(false) ->
    false;
to_binary(Data) when is_atom(Data) ->
    list_to_binary(atom_to_list(Data));
to_binary(Data) when is_number(Data) ->
    Data;
to_binary(Data) when is_binary(Data) ->
    Data.