-module(addressbook_exception).
-export([start/0,addressbook/1]).

start() ->
    register(addressbook, spawn(addressbook_exception, addressbook, [[]])).

addressbook(Data) -> 
  receive
    {From, {addUser, Name, Email}} ->
       case catch add(Name, Email, Data) of
         {ab_exception, user_exists} ->
            From ! {addressbook, no},
            addressbook(Data);
         NewData->
            From ! {addressbook, ok},
            addressbook(NewData)
       end;
    {From, {getName, Email}} ->
       From ! {addressbook, getname(Email, Data)},
       addressbook(Data);
    {From, {getEmail, Name}} ->
       From ! {addressbook, getemail(Name, Data)},
       addressbook(Data)
  end.

add(Name, Email, Data) ->
    case getemail(Name, Data) of
       undefined ->
         [{Name,Email}|Data];
       _ ->       % if Name already exists, exception is thrown.
         throw({ab_exception,user_exists})
    end.

getname(Email, [{Name, Email} | _Data]) -> Name;
getname(Email, [_H | Data]) ->
    getname(Email, Data);
getname(_Email, []) ->
    undefined.

getemail(Name, [{Name, Email} | _Data]) -> Email;
getemail(Name, [_H|Data]) ->
    getemail(Name, Data);
getemail(_Name, []) ->
    undefined.


%% Usage:
%
%  % erl -name addressbook@127.0.0.1 
%
% (addressbook@127.0.0.1)1> addressbook_exception:start().
%
