-module(dhcp_package).

-include("dhcp.hrl").

decode(<<Op:1/integer, HType:1/integer, HLen:1/integer, Hops:1/integer,
         XId:4/integer,
         Secs:2/integer, Flags:2/integer,
         CiAddr:4/integer,
         YiAddr:4/integer,
         SiAddr:4/integer,
         GiAddr:4/integer,
         ChAddr:16/integer,
         SName:64/binary,
         File:128/binary,
         Options/binary>>) ->
    #dhcp_package{
       op = decode_op(Op),
       htype = decode_htype(HType),
       hlen = HLen,
       hops = Hops,
       xid = XId,
       secs = Secs,
       flags = decode_flags(Flags),
       ciaddr = decode_ip(CiAddr),
       yiaddr = decode_ip(YiAddr),
       siaddr = decode_ip(SiAddr),
       giaddr = decode_ip(GiAddr),
       chaddr = decode_ip(ChAddr),
       sname = decode_string(SName),
       file = decode_string(File),
       options = decode_options(Options)
       }.


decode_op(1) ->
    request;
decode_op(2) ->
    reply.

decode_htype(T) ->
    T.

decode_flags(F) ->
    F.

decode_ip(IP) ->
    IP.

decode_mac(Mac) ->
    Mac.

decode_string(S) ->
    decode_string(S, <<>>).

decode_string(<<$0, _/binary>>, Bin) ->
    Bin;
decode_string(<<X:1/integer, R/binary>>, Bin) ->
    decode_string(R, <<Bin/binary, X:1/integer>>).

encode_string(B, Max) ->
    case bytelen(B) of
        L when L < Max ->
            Padding = Max - L,
            <<B, 0:Padding/integer>>
    end.

decode_options(Opts) ->
    Opts.
