%%------------------------------------------------------------------------------
%% 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.
%%------------------------------------------------------------------------------
-include("hessian.hrl").

-define(DUBBO_VERSION, <<"2.6.0">>).
-define(DUBBO_MEGIC, -9541). %% new version 16#dabb
-define(DUBBO_MEGIC_HIGH, 16#da). %% new version 16#da
-define(DUBBO_MEGIC_LOW, 16#bb). %% new version 16#bb

-define(DUBBO_DEFAULT_PORT, 20880).

%% 序列化类型
-define(SERIALIZATION_HESSIAN, 2).
-define(SERIALIZATION_FASTJSON, 6).
-define(SERIALIZATION_KRYO, 8).

-define(RESPONSE_WITH_EXCEPTION, 0).
-define(RESPONSE_VALUE, 1).
-define(RESPONSE_NULL_VALUE, 2).


-define(RESPONSE_STATE_OK, 20).

-define(REQUEST_TIME_OUT, 5000).

-define(LINE_SEPERATOR, <<"\n"/utf8>>).

-record(dubbo_request, {
    serialize_type = 2 :: integer(),
    is_event = true :: boolean(),
    is_twoway = false :: boolean(),
    data :: null|dubbo_rpc_invocation,
    mid :: integer(),
    mversion :: binary(),
    error_msg :: binary(),
    state :: byte(),
    decode_state
}).

-record(dubbo_response, {
    serialize_type = 2 :: integer(),
    is_event = true :: boolean(),
    is_twoway = false :: boolean(),
    data :: null|dubbo_rpc_invocation,
    mid :: integer(),
    mversion :: string(),
    error_msg :: string(),
    state :: byte(),
    decode_state
}).

-record(dubbo_rpc_invocation, {
    serialVersionUID = -4355285085441097045,
    className :: string(),
    classVersion :: string(),
    methodName :: string(),
    parameterDesc :: string(),
    parameterTypes = [] :: [#type_def{}],
    parameters = [] :: [term()],
    attachments = [] :: [term()]
}).

-record(consumer_config, {
    interface,
    application = <<"NoName">> :: binary(),
    category = <<"consumers">> :: binary(),
    check = false :: boolean(),
    default_timeout = 500 :: integer(),
    dubbo_version = <<"2.5.3">> :: binary(),
    methods = [] :: list(),
    revision = <<"">> :: binary(),
    side = <<"consumers">> :: binary()
}).

-record(provider_config, {
    protocol,
    host,
    port,
    interface,
    anyhost = true,
    executes = 1,
    application,
    dubbo = <<"2.5.3">>,
    methods = [],
    side = <<"provider">>
}).



-record(interface_list, {interface, pid, connection_info}).
-record(provider_node_list, {host_flag, connection_info}).
-record(connection_info, {connection_id, pid, weight, host_flag, readonly = false}).

-type dubbo_request() :: #dubbo_request{}.
-type dubbo_response() :: #dubbo_response{}.