%%
%% 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(server).

-include("calculator_thrift.hrl").

-export([start/0, start/1, handle_function/2,
         stop/1, ping/0, add/2, calculate/2, getStruct/1, zip/0]).

debug(Format, Data) ->
    error_logger:info_msg(Format, Data).

ping() ->
    debug("ping()",[]),
    ok.

add(N1, N2) ->
    debug("add(~p,~p)",[N1,N2]),
    N1+N2.

calculate(Logid, Work) ->
    { Op, Num1, Num2 } = { Work#work.op, Work#work.num1, Work#work.num2 },
    debug("calculate(~p, {~p,~p,~p})", [Logid, Op, Num1, Num2]),
    case Op of
        ?tutorial_Operation_ADD      -> Num1 + Num2;
        ?tutorial_Operation_SUBTRACT -> Num1 - Num2;
        ?tutorial_Operation_MULTIPLY -> Num1 * Num2;

        ?tutorial_Operation_DIVIDE when Num2 == 0 ->
          throw(#invalidOperation{what=Op, why="Cannot divide by 0"});
        ?tutorial_Operation_DIVIDE ->
          Num1 div Num2;

        _Else ->
          throw(#invalidOperation{what=Op, why="Invalid operation"})
    end.

getStruct(Key) ->
    debug("getStruct(~p)", [Key]),
    #sharedStruct{key=Key, value="RARG"}.

zip() ->
    debug("zip", []),
    ok.

%%

start() ->
    start(9999).

start(Port) ->
    Handler   = ?MODULE,
    thrift_socket_server:start([{handler, Handler},
                                {service, calculator_thrift},
                                {port, Port},
                                {name, tutorial_server}]).

stop(Server) ->
    thrift_socket_server:stop(Server).

handle_function(Function, Args) when is_atom(Function), is_tuple(Args) ->
    case apply(?MODULE, Function, tuple_to_list(Args)) of
        ok -> ok;
        Reply -> {reply, Reply}
    end.
