1:- module(bitrix24_regapp, [
    2              install/2,
    3              install/3
    4          ]).    5
    6:- use_module(bitrix24_config).    7:- use_module(bitrix24_install).    8:- use_module(bitrix24_event, []).    9:- use_module(bitrix24_placement, []).   10
   11install(Provider, Data) :-
   12    install(Provider, Data, _).
   13
   14install(Provider, Data, ContextRef) :-
   15    bitrix24_install:save_payload_contexts(Provider, Data, [ContextRef-_]),
   16    'event.unbind'(Provider, ContextRef),
   17    'event.bind'(Provider, ContextRef),
   18    'placement.unbind'(Provider, ContextRef),
   19    'placement.bind'(Provider, ContextRef),
   20    !.
   21
   22'event.unbind'(Provider, ContextRef) :-
   23    bitrix24_event:get(Provider, ContextRef, Reply),
   24    forall(member(Xs, Reply), (
   25           memberchk(event=Event, Xs),
   26           memberchk(handler=Handler, Xs),
   27           ( Event == 'ONAPPINSTALL'
   28           -> true
   29           ;  bitrix24_event:unbind(Provider, ContextRef, Event, Handler, UnbindReply),
   30              successful_unbind(UnbindReply)
   31           )
   32       )).
   33
   34'event.bind'(Provider, ContextRef) :-
   35    forall(config(event, E, H), (
   36               bitrix24_event:bind(Provider, ContextRef, E, H, Reply),
   37               successful_bind(Reply)
   38           )).
   39
   40'placement.unbind'(Provider, ContextRef) :-
   41    bitrix24_placement:get(Provider, ContextRef, Reply),
   42    forall(member(Xs, Reply), (
   43           memberchk(placement=Placement, Xs),
   44           memberchk(handler=Handler, Xs),
   45           bitrix24_placement:unbind(Provider, ContextRef, Placement, Handler, UnbindReply),
   46           successful_unbind(UnbindReply)
   47       )).
   48
   49'placement.bind'(Provider, ContextRef) :-
   50    forall(placement_config(E, H, T), (
   51               bitrix24_placement:bind(Provider, ContextRef, E, H, T, Reply),
   52               successful_bind(Reply)
   53           )).
   54
   55placement_config(Placement, Handler, Title) :-
   56    config(placement, Placement, [Handler, Title]),
   57    !.
   58placement_config(Placement, Handler, Title) :-
   59    config(placement, Placement, Handler),
   60    Title = Handler.
   61
   62successful_bind(Reply) :-
   63    memberchk(result = @(true), Reply),
   64    !.
   65successful_bind(Reply) :-
   66    throw(error(bitrix24_registration_failed(Reply), _)).
   67
   68successful_unbind(Reply) :-
   69    ( memberchk(result = @(true), Reply)
   70    ; memberchk(count = _, Reply)
   71    ),
   72    !.
   73successful_unbind(Reply) :-
   74    throw(error(bitrix24_registration_failed(Reply), _))