%/* Interface, timeline:
% * - printf the list, one event per line.
% * - branches: interactively ask which branches to act upon!
% * - [but: visually show branches, eg. by indenting.] */

:- dynamic(object/1).

go :-
	write('This is uCSI (unstable Crime Scene Investigation)'), nl,
	write('today using a hacky prolog CLI interface;'), nl,
	write('so end input with a dot, even when you\'re'), nl,
	write('only expected to enter a single letter.'), nl, nl,
	loop.

loop :- 
	write('Main: a. = Evidence-based tasks | b. = Events based task.'),
	write('		| h. = halt  | q. = Quit '),
	nl, read(Letter),
	(
		( Letter = 'a', evidence_tasks )
		;
		( Letter = 'b', events_tasks )
		;
		( Letter = 'h', halt )
	),
	Letter = 'q'
	;
	loop.
		
%%%probably reduntant parentheses etc. (but I'm nowhere near LISP levels yet!')

% ---------------------------------------------

evidence_tasks :-
	write( 'Evidence menu: a. = Add  | c. = Conflicts.  | ' ),
	write( ' i. = Inspect all evidence  | q. = quit / go back' ), nl,
	read(Letter),
	(
		( Letter = 'a', 
		  write( 'Enter prolog facts and finish with q. to stop.' ), nl,
		  add_loop )
		;
		( Letter = 'c', list_conflicts )
		;
		( Letter = 'i', inspect_evidence )
		;
		( Letter = 'q', true )
		;
		evidence_tasks
	).
	
% ---------------------------------------------

add_evidence_loop :-
	write('who - actor: '), read(Actor),
	(	Actor = 'q'
		;
		(	
			write('what - action: '), read(Action),
			write('to - object: '), read(Object),
			assert(evidence(Actor, Action, Object)),
			write('		asserted evidence('), write(X), write(')'),
			add_loop
		)
	).

list_conflicts :-
	fail.
%do_fc -- assert all "contradicts" relations
%findall/3 "contradicts" relation predicates

	
inspect_evidence :-
	findall(evidence(X, Y, Z), evidence(X, Y, Z), List),
	print_ol(List).
	
% ---------------------------------------------

events_tasks :-
	write( 'Events menu: e. = add  | l.= List evidence for an event | t. = ' ),
	write( ' Traverse the Timeline		| q. = quite / go back'), nl,
	read(Letter),
	(	
		( Letter = 'a', add_event_loop )
		;
		( Letter = 'l', evidence_for_event )
		;
		( Letter = 't', traverse_timeline )
		;
		( Letter = 'q', true )
		;
		events_tasks
	).
	
% ---------------------------------------------

add_event_loop :-
	write('who - actor: '), read(Actor),
	(	Actor = 'q'
		;
		(	
			write('what - action: '), read(Action),
			write('to - object: '), read(Object),
			write('when - time'), read(Time),
			write('where - place: '), read(Place),
			assert(event(Actor, Action, Object, Time, Place)),
			write('		asserted evidence('), write(X), write(')'),
			add_loop
		)
	).

evidence_for_event :-
	%findall(object(event(X,_), List, X), print_ol(List, 1),
	write('make your choice, enter number: '), read(Number),
	%nth1(List, Number, Id),
	%findall(relation(Id, evidence, Y),
	%findall(relation(_, evidence, Id)
	fail.

% this prints an ordered list, ie. it writes the index number before every
% element. Second argument should be 0 or 1, wherever you want counting to start.

traverse_timeline :-
	fail.
	%careful, keep it simple!
	
print_ol( [], _ ).
print_ol( [ Head | Tail ], Count) :-
	write(Count), write('-'), write(Head), nl,
	NewCount is Count + 1,
	print_ol( Tail, NewCount ).
	


% ---------------------------------------------
ask_trust( X, Number ) :-
	write('How much do you trust this assertion about'), write(X), nl,
	write('-1: I do not trust it'), nl,
	write(' 0: I will not answer'), nl,
	write(' 1: I have done careful checking (beyond reasonable doubt)'), nl,
	write(' 2: I trust it ultimately (scientific)'), nl,
	write('[0]: '), read(Number), nl,
	(
		( 
			nonvar(Number),
			Number >= -1, Number =< 2
		)
		;
		ask_trust(Number)
	).

