/***********************************************************************

 
         name: domain_agenda.pl
  description: Domain file with plans and sortal restrictions for AgendaTalk
               Plans: add_event, delete_event, more_info, change_info,
	       change_date, change_time, usage,X^start_time_to_store(X),
	       X^event_to_store(X), X^bookings(X)      
       author: Rebecca Jonson

***************************************************************************/

:- module( domain_agenda, [ plan/2,
			 issue/2,
			 sort_restr/1,
			 isa/2,
			 postcond/2,
			 depends/2,
			 resource_of_type/1
			  ] ).


resource_of_type(domain).


:- discontiguous output_form/3, input_form/2, plan/2, postcond/2.
:- use_module( library(lists), [ member/2, select/3, append/3 ] ).
:-use_module( calendar, [day2date/2, inconsistent/2, consistent/2] ).

:- ensure_loaded( library( semsort_agendatalk ) ).



/*----------------------------------------------------------------------
     Dialogue plans

     plan( ?ActionOrIssue, ?Plan )
----------------------------------------------------------------------*/
default_question(dummy).
depends(dummy,dummy).

%Actions

plan(top, [forget_all,
	   raise(X^action(X)),
	   findout(set([action(add_event),
	   		action(get_info)
			]))
			
			]).
postcond(top, none).


%%%%%%%%%%%%%%%ADD EVENT%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
plan(add_event, [
		findout(X0^event_to_store(X0)),
		findout(X1^date_to_store(X1)),
		findout(X2^start_time_to_store(X2)),
		findout(X3^am_or_pm(X3)),
		findout(X6^take_down_event(X6)),
		if_then_else(take_down_event(yes), [dev_do(agenda,'AddEvent'), report('AddEvent', done),forget_all],
			[findout(set([action(more_info),action(change_info),action(delete_event)]))])
		]).
postcond( add_event, done('AddEvent') ).
postcond(add_event, status('AddEvent',failed(_))).

plan(get_info,[findout(X^issue(X))]).
postcond(get_info,none).
%%%%%%%%%%%%%%%



plan(more_info, [
		findout(X1^location_to_store(X1)), 
		if_then(take_down_event(_), [forget(take_down_event(_))]),
		%if_then(location_to_store(_), [dev_do(agenda, 'MoreInfo')]),
		do(add_event)
		]).
postcond(more_info, none).

%%%delete current event!!!
plan(delete_current_event, [report('AddEvent', failed(_)), forget_all]).
postcond(delete_current_event, status('AddEvent', failed(_))).

plan(change_info, [findout(X1^which_info(X1)),
		   if_then(which_info(date), [forget(date_to_store(_)), findout(X2^date_to_store(X2))]),
		   if_then(which_info(time), [forget(start_time_to_store(_)), forget(am_or_pm(_)), findout(X3^start_time_to_store(X3)), findout(X5^am_or_pm(X5))]),
		   if_then(which_info(location),[if_then_else(location_to_store(_),[forget(location_to_store(_)), findout(X4^location_to_store(X4))], [report('InfoChanged', failed(_))])]),
		   if_then(take_down_event(_),[forget(take_down_event(_))]),
		   %dev_do(agenda, 'InfoChanged'),
		   forget(which_info(X1)),
		   %up
		   do(add_event)
			   ]).
postcond(change_info, done('InfoChanged')).



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

plan(delete_event,[findout(X1^event_to_store(X1)),
		   findout(X2^olddate(X2)),
		   dev_do(agenda,'DeleteEvent')] ).
postcond(delete_event, done('DeleteEvent')).
postcond(delete_event, status('DeleteEvent',failed)).


plan(change_time,[findout(X1^event_to_store(X1)),
		   findout(X2^olddate(X2)),
		   findout(X3^newtime(X3)),
		   findout(X3^am_or_pm(X3)),
		   dev_do(agenda,'ChangeTime')] ).
postcond(change_time, done('ChangeTime')).
postcond(change_time, status('ChangeTime',failed(_))).

plan(change_date,[findout(X1^event_to_store(X1)),
		   findout(X2^olddate(X2)),
		   findout(X3^newdate(X3)),
		  %%same time? else findout(X4^newtime(X4))
		  %%%and dev_do(agenda,'Change_DateTime')
		   dev_do(agenda,'ChangeDate') ] ).
postcond(change_date, done('ChangeDate')).
postcond(change_date, status('ChangeDate',failed(_))).
%%%%User Questions%%%%

plan(X^start_time_to_store(X),[ findout(X1^event_to_store(X1)),
				findout(X2^olddate(X2)),
				dev_query(agenda,time(X)) ] ).


plan(X^event_to_store(X),[findout(X1^date_to_store(X1)),
			  findout(X2^start_time_to_store(X2)),
		          findout(X3^am_or_pm(X3)),
			  dev_query(agenda, event(X))	
		 ]).

plan(X^bookings(X),[findout(X1^date_to_store(X1)),
		    dev_query(agenda, bookings(X))	
		 ]).

plan(X^todaysdate(X),[
		    dev_query(agenda, todaysdate(X))	
		 ]).

%user help (question)
plan(usage,[ dev_query(agenda,usage) ]).

%other...
plan( up, [] ).

%changin language
/*plan( change_language,
      [ raise(X^language(X)),
	findout(set([language(english), language(svenska)])),
	change_language ] ).
postcond( change_language, done(change_language) ).*/
/*--------------------------------------------------------------
     Conceptual knowledge
----------------------------------------------------------------------*/

% sortal restrictions; determine relevance and resolvement

sort_restr(usage).



%%%Agendatalk

sort_restr( event_to_store(X)) :- sem_sort(X, event).
sort_restr( location_to_store(X)) :- sem_sort(X, location).
sort_restr( location(X)) :- sem_sort(X, location).
sort_restr( start_time_to_store( X ) ) :- sem_sort( X, time ).
sort_restr( stop_time_to_store( X ) ) :- sem_sort( X, time ).
sort_restr( newtime( X ) ) :- sem_sort( X, time ).
sort_restr( date_to_store( X ) ) :- sem_sort( X, date ).
sort_restr( newdate( X ) ) :- sem_sort( X, date ).
sort_restr( olddate( X ) ) :- sem_sort( X, date ).
sort_restr( number( X ) ) :- sem_sort( X, number ).
sort_restr( date( X ) ) :- sem_sort( X, date ).
sort_restr( time( X ) ) :- sem_sort( X, time ).
sort_restr( time( X ) ) :- sem_sort( X, number ).
sort_restr( event( X ) ) :- sem_sort( X, event ).
sort_restr( attendee(X)):- sem_sort(X, person).
sort_restr( add_more_info(X)):-sem_sort(X,yn_answer).
sort_restr( take_down_event(X)):-sem_sort(X,yn_answer).
sort_restr( am_or_pm(X)):-sem_sort(X,dayhalf).
sort_restr( which_info(X)):-sem_sort(X, info).
sort_restr( bookings([E,T])):-check_events(E),check_times(T).
sort_restr( todaysdate(X)):- sem_sort(X, date).
% negation

sort_restr( not P ) :- sort_restr( P ).
% action
sort_restr( action( X ) ) :- sem_sort( X, action ).
sort_restr( action( respond(Q) ) ) :- sort_restr( issue(Q) ).

sort_restr( issue(Q) ):- plan( Q, _ ),
        \+ sort_restr( action( Q ) ).

sort_restr( issue(Q) ):-
        plan( _, Plan ),
        member( findout(Q), Plan ),
        \+ sort_restr( action( Q ) ).

% metaissue

sort_restr( und(_DP*P) ):- sort_restr(P).

% sloppy, but allows "no" as answer to clarification alt-q
% could be replaced by general rule saying that not(set([p1, ..., ])) is sortally correct,
% menaing the same as (not P1 and not p2 and...)

sort_restr( not und(_DP*set(_))).

check_events([]).
check_events([E|Events]):-					     
	sem_sort(E, event),
	check_events(Events).
check_times([]).
check_times([T|Times]):-
	sem_sort(T,time),
	check_times(Times).
%AgendaTalk
valid_parameter( start_time_to_store(N) ):- sem_sort( N, time ).
valid_parameter( start_time_to_store(N) ):- sem_sort( N, number ).
valid_parameter( stop_time_to_store(N) ):- sem_sort( N, time ).
valid_parameter( newtime(N) ):- sem_sort( N, time ).
valid_parameter( date_to_store( X ) ) :- sem_sort( X, date ), calendar:day2date(X, DATE),calendar:consistent(DATE,yes).
valid_parameter( newdate( X ) ) :- sem_sort( X, date ), calendar:day2date(X, DATE),calendar:consistent(DATE,yes).
valid_parameter( olddate( X ) ) :- valid_parameter( date_to_store(X)).
valid_parameter( event_to_store(X)):-sem_sort(X,event).
valid_parameter( location_to_store(X)):- sem_sort(X,location).
valid_parameter( attendee(X)):-sem_sort(X, person).
valid_parameter( age_to_store(X)):-sem_sort(X, number).
valid_parameter( am_or_pm(X)):-sem_sort(X, dayhalf).
valid_parameter( which_info(X)):-sem_sort(X, info).


incompatible(P,P):-singleton(P).
singleton(start_time_to_store).
singleton(event_to_store).
singleton(am_or_pm).
singleton(date).
singleton(time).