%%------------------------------------------------------------------------------
%% Licensed to the Apache Software Foundation (ASF) under one or more
%% contributor license agreements.  See the NOTICE file distributed with
%% this work for additional information regarding copyright ownership.
%% The ASF licenses this file to You 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(dubbo_serializa_hessian).

-include("dubbo.hrl").
%% API
-export([decode_header/1]).
-export([decode_response/2]).
-export([decode_request/2]).
-export([encode_request_data/1, encode_response_data/1]).


encode_request_data(Request) ->
    State = dubbo_type_encoding:init(),
    DataType = case Request#dubbo_request.is_event of
                   true ->
                       dubbo_event;
                   false ->
                       case Request#dubbo_request.data of
                           #dubbo_rpc_invocation{} ->
                               dubbo_rpc_invocation;
                           _ ->
                               unknow
                       end
               end,
    {ok, Bin} = encode_request_data(DataType, Request, Request#dubbo_request.data, State),
    {ok, Bin}.

encode_request_data(dubbo_event, _Request, Data, State) ->
    Bin = cotton_hessian:encode(Data, State),
    {ok, Bin};
encode_request_data(dubbo_rpc_invocation, _Request, Data, State) ->
    METHOD_NAME = Data#dubbo_rpc_invocation.methodName,
    METHOD_ARGS_TYPES = Data#dubbo_rpc_invocation.parameterDesc,
    RequestList = [
        cotton_hessian:encode(?DUBBO_VERSION, State), %% dubbo version
        cotton_hessian:encode(Data#dubbo_rpc_invocation.className, State),
        cotton_hessian:encode(Data#dubbo_rpc_invocation.classVersion, State),
        cotton_hessian:encode(METHOD_NAME, State),
        cotton_hessian:encode(METHOD_ARGS_TYPES, State)
    ],
    {ArgsBin, State2} = encode_arguments(Data, State),
    AttachDict = dict:from_list(Data#dubbo_rpc_invocation.attachments),
    AttachMaps = #map{dict = AttachDict},
    {AttachBinay, _} = cotton_hessian:encode(AttachMaps, State2),
    RequestData = erlang:iolist_to_binary(RequestList ++ [ArgsBin, AttachBinay]),
    {ok, RequestData}.


encode_response_data(Response) ->
    State = dubbo_type_encoding:init(),
    DataType = case Response#dubbo_response.is_event of
                   true ->
                       dubbo_event;
                   false ->
                       case Response#dubbo_response.data of
                           #dubbo_rpc_invocation{} ->
                               dubbo_rpc_invocation;
                           _ ->
                               unknow
                       end
               end,
    {ok, Bin} = encode_response_data(DataType, Response, Response#dubbo_response.data, State),
    {ok, Bin}.

encode_response_data(dubbo_event, _Response, Data, State) ->
    Bin = cotton_hessian:encode(Data, State),
    {ok, Bin};
encode_response_data(dubbo_rpc_invocation, _Response, Data, State) ->
    Result = case Data of
                 null ->
                     [
                         cotton_hessian:encode(?RESPONSE_NULL_VALUE, State)
                     ];
                 _ ->
                     {ArgsBin, _State2} = encode_arguments(Data, State),
                     [
                         cotton_hessian:encode(?RESPONSE_VALUE, State),
                         ArgsBin
                     ]
             end,
    ResponseData = erlang:iolist_to_binary(Result),
    {ok, ResponseData}.

encode_arguments(Data, State) ->
    {StateNew} = lists:foldl(fun(X, {StateTmp}) ->
        StateTmpNew = dubbo_type_encoding:enlist(X, StateTmp),
        {StateTmpNew} end,
        {State}, Data#dubbo_rpc_invocation.parameterTypes),
    {Bin, State2} = lists:foldl(fun(X, {BinTmp, StateTmp2}) ->
        case cotton_hessian:encode(X, StateTmp2) of
            {ArgsBin, StateTmpNew} ->
                {<<BinTmp/binary, ArgsBin/binary>>, StateTmpNew};
            ArgsBin2 ->
                {<<BinTmp/binary, ArgsBin2/binary>>, StateTmp2}
        end end,
        {<<>>, StateNew}, Data#dubbo_rpc_invocation.parameters),
    {Bin, State2}.

-spec decode_header(binary()) -> {State :: ok|error, Type :: request|response, Data :: #dubbo_response{}|#dubbo_request{}}.
decode_header(Header) ->
    <<?DUBBO_MEGIC_HIGH, ?DUBBO_MEGIC_LOW, Flag:8, State:8, Mid:64, DataLen:32>> = Header,
    if
        (Flag band 16#80) == 0 ->
            {DecodeState, Res} = decode_header(response, Flag, State, Mid, DataLen),
            {DecodeState, response, Res};
        true ->
            {DecodeState, Req} = decode_header(request, Flag, State, Mid, DataLen),
            {DecodeState, request, Req}
    end.
decode_header(request, Flag, _State, Mid, _DataLen) ->
    SerializeType = Flag band 16#1f,
    IsTwoWay = if
                   (Flag band 16#40) /= 0 -> true;
                   true -> false
               end,
    IsEvent = if
                  (Flag band 16#20) /= 0 -> true;
                  true -> false
              end,
    Req = #dubbo_request{
        is_event = IsEvent,
        is_twoway = IsTwoWay,
        mid = Mid,
        mversion = <<"2.0.0">>,
        serialize_type = SerializeType
    },
    {ok, Req};
decode_header(response, Flag, State, Mid, _DataLen) ->
    SerializeType = Flag band 16#1f,
    IsEvent = if
                  (Flag band 16#20) /= 0 -> true;
                  true -> false
              end,
    Res = #dubbo_response{is_event = IsEvent,
        serialize_type = SerializeType,
        state = State,
        mid = Mid
    },
    {ok, Res}.

-spec decode_response(#dubbo_response{}, binary()) -> {ok, #dubbo_response{}}.
decode_response(Res, Data) ->
    if
        Res#dubbo_response.is_event == true ->
            decode_response(dubbo_event, Res, Data);
        true ->
            decode_response(dubbo_rpc_invocation, Res, Data)
    end.

decode_response(dubbo_rpc_invocation, Res, Data) ->
    {Rest, Type, State} = cotton_hessian:decode(Data, cotton_hessian:init()),
    case Type of
        1 ->
            {_, Object, DecodeState} = cotton_hessian:decode(Rest, State),
            {ok, Res#dubbo_response{data = Object, decode_state = DecodeState}};
        2 ->
            {ok, Res#dubbo_response{data = null, decode_state = State}};
        _ ->
            logger:warning("decode unkonw type ~p ~p", [Type, Rest]),
            {Rest2, Object2, DecodeState2} = cotton_hessian:decode(Rest, State),
            logger:warning("decode unkonw type2 ~p ~p", [Object2, Rest2]),
            {ok, Res#dubbo_response{data = Object2, decode_state = DecodeState2}}
    end;
decode_response(dubbo_event, Res, Data) ->
    {_Rest, undefined, _NewState} = cotton_hessian:decode(Data, cotton_hessian:init()),
    {ok, Res#dubbo_response{data = undefined}}.

-spec decode_request(#dubbo_request{}, binary()) -> {ok, #dubbo_request{}}.
decode_request(Req, Data) ->
    if
        Req#dubbo_request.is_event == true ->
            decode_request(dubbo_event, Req, Data);
        true ->
            decode_request(dubbo_rpc_invocation, Req, Data)
    end.

decode_request(dubbo_rpc_invocation, Req, Data) ->
    {ResultList, _NewState, _RestData} = decode_request_body(Data, cotton_hessian:init(), [dubbo, path, version, method_name, desc_and_args, attachments]),
    [_DubboVersion, Path, Version, MethodName, _Desc, ArgsObj, Attachments] = ResultList,
    RpcData = #dubbo_rpc_invocation{className = trans_path_to_classname(Path), classVersion = Version, methodName = MethodName, parameterDesc = Data, parameters = ArgsObj, attachments = Attachments},
    Req2 = Req#dubbo_request{data = RpcData},
    {ok, Req2};
decode_request(dubbo_event, Req, Data) ->
    {_Rest, EventData, _NewState} = cotton_hessian:decode(Data, cotton_hessian:init()),
    {ok, Req#dubbo_request{data = EventData}}.

decode_request_body(Data, State, List) ->
    {ResultList, NewState, RestData} = decode_request_body(List, Data, State, []),
    {lists:reverse(ResultList), NewState, RestData}.
decode_request_body([ParseType | List], Data, State, ResultList)
    when ParseType == dubbo;ParseType == path;ParseType == version;ParseType == method_name ->
    {Rest, Result, NewState} = cotton_hessian:decode(Data, State),
    decode_request_body(List, Rest, NewState, [Result] ++ ResultList);
decode_request_body([desc_and_args | List], Data, State, ResultList) ->
    {Rest, ParameterDesc, State1} = cotton_hessian:decode(Data, State),
    if
        size(ParameterDesc) == 0 ->
            decode_request_body(List, Rest, State1, [[], []] ++ ResultList);
        true ->
            ParameterDescArray = binary:split(ParameterDesc, <<";">>),
            {ArgsObjList, NewState, RestData} = decode_request_body_args(ParameterDescArray, Rest, State1, []),
            decode_request_body(List, RestData, NewState, [ArgsObjList, ParameterDesc] ++ ResultList)
    end;
decode_request_body([attachments | List], Data, State, ResultList) ->
    {Rest, Attachments, State1} = cotton_hessian:decode(Data, State),
    AttachmentsList = dict:to_list(Attachments#map.dict),
    decode_request_body(List, Rest, State1, [AttachmentsList] ++ ResultList);
decode_request_body([_Type1 | List], Data, State, ResultList) ->
    logger:warning("decode_request_body unknow type"),
    decode_request_body(List, Data, State, ResultList);
decode_request_body([], Data, State, ResultList) ->
    {ResultList, State, Data}.

decode_request_body_args([], Data, State, ArgsObjList) ->
    {ArgsObjList, State, Data};
decode_request_body_args([ArgsType | RestList], Data, State, ArgsObjList) when ArgsType == <<>> ->
    decode_request_body_args(RestList, Data, State, ArgsObjList);
decode_request_body_args([_ArgsType | RestList], Data, State, ArgsObjList) ->
    {Rest, ArgObj, NewState} = cotton_hessian:decode(Data, State),
    ArgObj2 = dubbo_type_transfer:classobj_to_native(ArgObj, NewState),
    decode_request_body_args(RestList, Rest, NewState, ArgsObjList ++ [ArgObj2]).

trans_path_to_classname(<<?URL_PATH_SEPARATOR:8,Rest/binary>>) ->
    Rest;
trans_path_to_classname(Path) ->
    Path.
