%% Created automatically by XML generator (fxml_gen.erl)
%% Source: xmpp_codec.spec

-module(xep0191).

-compile(export_all).

do_decode(<<"blocklist">>, <<"urn:xmpp:blocking">>, El,
          Opts) ->
    decode_block_list(<<"urn:xmpp:blocking">>, Opts, El);
do_decode(<<"unblock">>, <<"urn:xmpp:blocking">>, El,
          Opts) ->
    decode_unblock(<<"urn:xmpp:blocking">>, Opts, El);
do_decode(<<"block">>, <<"urn:xmpp:blocking">>, El,
          Opts) ->
    decode_block(<<"urn:xmpp:blocking">>, Opts, El);
do_decode(<<"item">>, <<"urn:xmpp:blocking">>, El,
          Opts) ->
    decode_block_item(<<"urn:xmpp:blocking">>, Opts, El);
do_decode(Name, <<>>, _, _) ->
    erlang:error({xmpp_codec, {missing_tag_xmlns, Name}});
do_decode(Name, XMLNS, _, _) ->
    erlang:error({xmpp_codec, {unknown_tag, Name, XMLNS}}).

tags() ->
    [{<<"blocklist">>, <<"urn:xmpp:blocking">>},
     {<<"unblock">>, <<"urn:xmpp:blocking">>},
     {<<"block">>, <<"urn:xmpp:blocking">>},
     {<<"item">>, <<"urn:xmpp:blocking">>}].

do_encode({block_item, _, _} = Item, TopXMLNS) ->
    encode_block_item(Item, TopXMLNS);
do_encode({block, _} = Block, TopXMLNS) ->
    encode_block(Block, TopXMLNS);
do_encode({unblock, _} = Unblock, TopXMLNS) ->
    encode_unblock(Unblock, TopXMLNS);
do_encode({block_list, _} = Blocklist, TopXMLNS) ->
    encode_block_list(Blocklist, TopXMLNS).

do_get_name({block, _}) -> <<"block">>;
do_get_name({block_item, _, _}) -> <<"item">>;
do_get_name({block_list, _}) -> <<"blocklist">>;
do_get_name({unblock, _}) -> <<"unblock">>.

do_get_ns({block, _}) -> <<"urn:xmpp:blocking">>;
do_get_ns({block_item, _, _}) ->
    <<"urn:xmpp:blocking">>;
do_get_ns({block_list, _}) -> <<"urn:xmpp:blocking">>;
do_get_ns({unblock, _}) -> <<"urn:xmpp:blocking">>.

pp(block_item, 2) -> [jid, spam_report];
pp(block, 1) -> [items];
pp(unblock, 1) -> [items];
pp(block_list, 1) -> [items];
pp(_, _) -> no.

records() ->
    [{block_item, 2},
     {block, 1},
     {unblock, 1},
     {block_list, 1}].

decode_block_list(__TopXMLNS, __Opts,
                  {xmlel, <<"blocklist">>, _attrs, _els}) ->
    Items = decode_block_list_els(__TopXMLNS,
                                  __Opts,
                                  _els,
                                  []),
    {block_list, Items}.

decode_block_list_els(__TopXMLNS, __Opts, [], Items) ->
    lists:reverse(Items);
decode_block_list_els(__TopXMLNS, __Opts,
                      [{xmlel, <<"item">>, _attrs, _} = _el | _els], Items) ->
    case xmpp_codec:get_attr(<<"xmlns">>,
                             _attrs,
                             __TopXMLNS)
        of
        <<"urn:xmpp:blocking">> ->
            decode_block_list_els(__TopXMLNS,
                                  __Opts,
                                  _els,
                                  [decode_block_item(<<"urn:xmpp:blocking">>,
                                                     __Opts,
                                                     _el)
                                   | Items]);
        _ ->
            decode_block_list_els(__TopXMLNS, __Opts, _els, Items)
    end;
decode_block_list_els(__TopXMLNS, __Opts, [_ | _els],
                      Items) ->
    decode_block_list_els(__TopXMLNS, __Opts, _els, Items).

encode_block_list({block_list, Items}, __TopXMLNS) ->
    __NewTopXMLNS =
        xmpp_codec:choose_top_xmlns(<<"urn:xmpp:blocking">>,
                                    [],
                                    __TopXMLNS),
    _els = lists:reverse('encode_block_list_$items'(Items,
                                                    __NewTopXMLNS,
                                                    [])),
    _attrs = xmpp_codec:enc_xmlns_attrs(__NewTopXMLNS,
                                        __TopXMLNS),
    {xmlel, <<"blocklist">>, _attrs, _els}.

'encode_block_list_$items'([], __TopXMLNS, _acc) ->
    _acc;
'encode_block_list_$items'([Items | _els], __TopXMLNS,
                           _acc) ->
    'encode_block_list_$items'(_els,
                               __TopXMLNS,
                               [encode_block_item(Items, __TopXMLNS) | _acc]).

decode_unblock(__TopXMLNS, __Opts,
               {xmlel, <<"unblock">>, _attrs, _els}) ->
    Items = decode_unblock_els(__TopXMLNS,
                               __Opts,
                               _els,
                               []),
    {unblock, Items}.

decode_unblock_els(__TopXMLNS, __Opts, [], Items) ->
    lists:reverse(Items);
decode_unblock_els(__TopXMLNS, __Opts,
                   [{xmlel, <<"item">>, _attrs, _} = _el | _els], Items) ->
    case xmpp_codec:get_attr(<<"xmlns">>,
                             _attrs,
                             __TopXMLNS)
        of
        <<"urn:xmpp:blocking">> ->
            decode_unblock_els(__TopXMLNS,
                               __Opts,
                               _els,
                               [decode_block_item(<<"urn:xmpp:blocking">>,
                                                  __Opts,
                                                  _el)
                                | Items]);
        _ -> decode_unblock_els(__TopXMLNS, __Opts, _els, Items)
    end;
decode_unblock_els(__TopXMLNS, __Opts, [_ | _els],
                   Items) ->
    decode_unblock_els(__TopXMLNS, __Opts, _els, Items).

encode_unblock({unblock, Items}, __TopXMLNS) ->
    __NewTopXMLNS =
        xmpp_codec:choose_top_xmlns(<<"urn:xmpp:blocking">>,
                                    [],
                                    __TopXMLNS),
    _els = lists:reverse('encode_unblock_$items'(Items,
                                                 __NewTopXMLNS,
                                                 [])),
    _attrs = xmpp_codec:enc_xmlns_attrs(__NewTopXMLNS,
                                        __TopXMLNS),
    {xmlel, <<"unblock">>, _attrs, _els}.

'encode_unblock_$items'([], __TopXMLNS, _acc) -> _acc;
'encode_unblock_$items'([Items | _els], __TopXMLNS,
                        _acc) ->
    'encode_unblock_$items'(_els,
                            __TopXMLNS,
                            [encode_block_item(Items, __TopXMLNS) | _acc]).

decode_block(__TopXMLNS, __Opts,
             {xmlel, <<"block">>, _attrs, _els}) ->
    Items = decode_block_els(__TopXMLNS, __Opts, _els, []),
    {block, Items}.

decode_block_els(__TopXMLNS, __Opts, [], Items) ->
    lists:reverse(Items);
decode_block_els(__TopXMLNS, __Opts,
                 [{xmlel, <<"item">>, _attrs, _} = _el | _els], Items) ->
    case xmpp_codec:get_attr(<<"xmlns">>,
                             _attrs,
                             __TopXMLNS)
        of
        <<"urn:xmpp:blocking">> ->
            decode_block_els(__TopXMLNS,
                             __Opts,
                             _els,
                             [decode_block_item(<<"urn:xmpp:blocking">>,
                                                __Opts,
                                                _el)
                              | Items]);
        _ -> decode_block_els(__TopXMLNS, __Opts, _els, Items)
    end;
decode_block_els(__TopXMLNS, __Opts, [_ | _els],
                 Items) ->
    decode_block_els(__TopXMLNS, __Opts, _els, Items).

encode_block({block, Items}, __TopXMLNS) ->
    __NewTopXMLNS =
        xmpp_codec:choose_top_xmlns(<<"urn:xmpp:blocking">>,
                                    [],
                                    __TopXMLNS),
    _els = lists:reverse('encode_block_$items'(Items,
                                               __NewTopXMLNS,
                                               [])),
    _attrs = xmpp_codec:enc_xmlns_attrs(__NewTopXMLNS,
                                        __TopXMLNS),
    {xmlel, <<"block">>, _attrs, _els}.

'encode_block_$items'([], __TopXMLNS, _acc) -> _acc;
'encode_block_$items'([Items | _els], __TopXMLNS,
                      _acc) ->
    'encode_block_$items'(_els,
                          __TopXMLNS,
                          [encode_block_item(Items, __TopXMLNS) | _acc]).

decode_block_item(__TopXMLNS, __Opts,
                  {xmlel, <<"item">>, _attrs, _els}) ->
    Spam_report = decode_block_item_els(__TopXMLNS,
                                        __Opts,
                                        _els,
                                        undefined),
    Jid = decode_block_item_attrs(__TopXMLNS,
                                  _attrs,
                                  undefined),
    {block_item, Jid, Spam_report}.

decode_block_item_els(__TopXMLNS, __Opts, [],
                      Spam_report) ->
    Spam_report;
decode_block_item_els(__TopXMLNS, __Opts,
                      [{xmlel, <<"report">>, _attrs, _} = _el | _els],
                      Spam_report) ->
    case xmpp_codec:get_attr(<<"xmlns">>,
                             _attrs,
                             __TopXMLNS)
        of
        <<"urn:xmpp:reporting:0">> ->
            decode_block_item_els(__TopXMLNS,
                                  __Opts,
                                  _els,
                                  xep0377:decode_report(<<"urn:xmpp:reporting:0">>,
                                                        __Opts,
                                                        _el));
        _ ->
            decode_block_item_els(__TopXMLNS,
                                  __Opts,
                                  _els,
                                  Spam_report)
    end;
decode_block_item_els(__TopXMLNS, __Opts, [_ | _els],
                      Spam_report) ->
    decode_block_item_els(__TopXMLNS,
                          __Opts,
                          _els,
                          Spam_report).

decode_block_item_attrs(__TopXMLNS,
                        [{<<"jid">>, _val} | _attrs], _Jid) ->
    decode_block_item_attrs(__TopXMLNS, _attrs, _val);
decode_block_item_attrs(__TopXMLNS, [_ | _attrs],
                        Jid) ->
    decode_block_item_attrs(__TopXMLNS, _attrs, Jid);
decode_block_item_attrs(__TopXMLNS, [], Jid) ->
    decode_block_item_attr_jid(__TopXMLNS, Jid).

encode_block_item({block_item, Jid, Spam_report},
                  __TopXMLNS) ->
    __NewTopXMLNS =
        xmpp_codec:choose_top_xmlns(<<"urn:xmpp:blocking">>,
                                    [],
                                    __TopXMLNS),
    _els =
        lists:reverse('encode_block_item_$spam_report'(Spam_report,
                                                       __NewTopXMLNS,
                                                       [])),
    _attrs = encode_block_item_attr_jid(Jid,
                                        xmpp_codec:enc_xmlns_attrs(__NewTopXMLNS,
                                                                   __TopXMLNS)),
    {xmlel, <<"item">>, _attrs, _els}.

'encode_block_item_$spam_report'(undefined, __TopXMLNS,
                                 _acc) ->
    _acc;
'encode_block_item_$spam_report'(Spam_report,
                                 __TopXMLNS, _acc) ->
    [xep0377:encode_report(Spam_report, __TopXMLNS) | _acc].

decode_block_item_attr_jid(__TopXMLNS, undefined) ->
    erlang:error({xmpp_codec,
                  {missing_attr, <<"jid">>, <<"item">>, __TopXMLNS}});
decode_block_item_attr_jid(__TopXMLNS, _val) ->
    case catch jid:decode(_val) of
        {'EXIT', _} ->
            erlang:error({xmpp_codec,
                          {bad_attr_value, <<"jid">>, <<"item">>, __TopXMLNS}});
        _res -> _res
    end.

encode_block_item_attr_jid(_val, _acc) ->
    [{<<"jid">>, jid:encode(_val)} | _acc].
