%%-*- mode: erlang -*-
%% emqx_sn config mapping
{mapping, "mqtt.sn.port", "emqx_sn.port", [
  {default, "1884"},
  {datatype, string}
]}.

{translation, "emqx_sn.port", fun(Conf) ->
  case re:split(cuttlefish:conf_get("mqtt.sn.port", Conf, ""), ":", [{return, list}]) of
      [Port] ->
          {{0,0,0,0}, list_to_integer(Port)};
      Tokens ->
          Port = lists:last(Tokens),
          IP = case inet:parse_address(lists:flatten(lists:join(":", Tokens -- [Port]))) of
                   {error, Reason} ->
                       throw({invalid_ip_address, Reason});
                   {ok, X} -> X
               end,
          Port1 = list_to_integer(Port),
          {IP, Port1}
  end
end}.

{mapping, "mqtt.sn.advertise_duration", "emqx_sn.advertise_duration", [
  {default, "15s"},
  {datatype, {duration, ms}}
]}.

{mapping, "mqtt.sn.gateway_id", "emqx_sn.gateway_id", [
  {default, 1},
  {datatype, integer}
]}.

{mapping, "mqtt.sn.username", "emqx_sn.username", [
  {datatype, string}
]}.

{mapping, "mqtt.sn.password", "emqx_sn.password", [
  {datatype, string}
]}.

{mapping, "mqtt.sn.idle_timeout", "emqx_sn.idle_timeout", [
  {default, "30s"},
  {datatype, {duration, ms}}
]}.

{mapping, "mqtt.sn.enable_stats", "emqx_sn.enable_stats", [
  {datatype, flag}
]}.

{mapping, "mqtt.sn.enable_qos3", "emqx_sn.enable_qos3", [
  {datatype, flag}
]}.

{mapping, "mqtt.sn.predefined.topic.$id", "emqx_sn.predefined", [
  {datatype, string}
]}.

{translation, "emqx_sn.username", fun(Conf) ->
  Username = cuttlefish:conf_get("mqtt.sn.username", Conf),
  list_to_binary(Username)
end}.

{translation, "emqx_sn.password", fun(Conf) ->
  Password = cuttlefish:conf_get("mqtt.sn.password", Conf),
  list_to_binary(Password)
end}.

{translation, "emqx_sn.predefined", fun(Conf) ->
  List = cuttlefish_variable:filter_by_prefix("mqtt.sn.predefined.topic", Conf),
  TopicIdList = lists:sort([{list_to_integer(I), iolist_to_binary(TopicName)}
                            || {["mqtt", "sn", "predefined", "topic", I], TopicName}
                               <- List, I =/= "0"])
end}.
