% :- dynamic eventlist/1.
%:- dynamic lineCount/1.
% :- dynamic amount/1.

event(18, politie, 'krijgt melding van ellie', politiebureau, 2130, 2130).
event(20, politie, 'krijgt melding van jolien', politiebureau, 2130, 2140).

event(02, henk, 'komt aan bij barry', elandsstraat, 2100, 2120). 
event(03, henk, 'krijgt ruzie met barry', huis_barry, nb, nb). 
event(04, jolien, 'rent de huiskamer in', huis_barry, nb, nb).
event(05, jolien, 'hoort een schot', huis_barry, nb, nb).
event(15, jolien, 'vindt het lijk', huis_barry, nb, nb).
event(07, jolien, 'belt politie', huis_barry, nb, nb).

event(16, ellie, 'hoort pistoolschot', huis_ellie, nb, nb).
event(17, ellie, 'ziet man in blauw wegrijden', elandsstraat, nb, nb).
event(11, ellie, 'belt politie', huis_ellie, 2125, 2135).

event(09, charles, 'ziet oudere man aankomen', elandsstraat, 2110, 2120).
event(08, charles, 'laat zijn hond uit', elandsstraat, 2110, 2140).
event(10, charles, 'ziet man in zwart wegrijden', elandsstraat, 2125, 2140).

event(01, henk, 'vertrekt van huis', huis_henk, 2025, 2035). 
event(14, henk, 'is onderweg naar jolien', auto, 2025, 2115).

event(22, barry, 'schiet met pistool', huis_barry, nb, nb).
event(06, barry, 'steelt auto', elandsstraat, nb, nb).
event(23, barry, 'is onderweg naar rogier', nb, nb, nb).
event(13, barry, 'wordt gearresteerd', nb, nb, nb).

event(12, politie, 'arresteert barry', nb, 2430, 2430).
event(25, politie, 'arresteert rogier', nb, 2440, 2450).
event(26, politie, 'laat rogier vrij', nb, nb, nb).

volgorde(18, 20).

volgorde(02, 03).
volgorde(03, 04).
volgorde(04, 05).
volgorde(05, 15).
volgorde(15, 07).

volgorde(16, 17).
volgorde(17, 11).

volgorde(09, 08).
volgorde(08, 10).

volgorde(01, 14).
volgorde(14, 02).

volgorde(21, 22).
volgorde(22, 06).
volgorde(06, 23).
volgorde(23, 13).

volgorde(12, 25).
volgorde(25, 26).


zelfde_event(02, 09).
zelfde_event(05, 16).
zelfde_event(05, 22).
zelfde_event(07, 20).
zelfde_event(10, 17).
zelfde_event(10, 06).
zelfde_event(17, 06).
zelfde_event(13, 12).
zelfde_event(11, 18).

%volgt(A, B) :-
%	volgorde(A, B).
%volgt(A, B) :-
%	volgorde(A, C),
%	volgt(C,B).

na(A, B):-
	volgorde(A,B).

%event(Nummer, Actor, Eventstring, Location, Bmin/Bmax, Emin/Emax).

% nextEvent(Nummer, Lijst, EventList):-
% 	retractall(eventlist(__)),
% 	findall(N, event(N,_,_,_,_,_), List),
% 	assert(eventlist(List)),
% 	EventList = [],
%  	findNext(Nummer, Lijst, EventList).


%MENU/go wrapper
go:-
	nl,nl,
	write('Zie hier, het menu. Voer keuze in: '), nl,nl,
	write('1. List all evidence'), nl,
	write('2. List all events, actors, objects, actions, places, times'), nl,
	write('3. Add new event'), nl,
	write('4. Display conflicts/inconsistencies'), nl,
	write('5. Display possible timelines'), nl,
	write('6. Display all evidence supporting particular event'), nl,nl,
	write('0. Quit'),nl,nl, 
	read(X),
	(   (   member(X, [0,1,2,3,4,5,6]),!,
		menu(X)
	);
	(   write('Geen geldige optie, kies opnieuw: '),nl,nl,
	    go
	)).

	
pp([]).

pp([Head|Tail]):-
	write(Head),nl,
	pp(Tail).

%0. Quit
menu(0):-
	true.

%1. List all evidence
menu(1):-
	findall([A,B,C,D,E,F], event(A,B,C,D,E,F), List),
	write('Hieronder vindt u al het evidence, de volgorde is '), nl, write('als volgt: Eventnummer, Actor, Event, Locatie, Begintijd, Eindtijd'), nl, nl,
	pp(List).

%2. list all events, actors, objects, actions, places, times
menu(2):-
	nl,nl,
	write('Kies hier welke u wilt zien: '), nl,nl,
	write('1. Eventnummers '),nl,
	write('2. Actors '),nl,
 	write('3. Actions '),nl,
	write('4. Locaties '),nl,
	write('5. Tijden '),nl,nl,
	write('0. hoofdmenu'),nl,nl,
	read(X),
	menu2(X).


%3. add new event
menu(3):-
	nl,nl,
	write('Hier kunt u een nieuw event toevoegen. '), nl,nl,
	findall(N, event(N,_,_,_,_,_), Ns),
	sort(Ns, List),
	reverse(List, [Head|_]),
	NewN is Head + 1,
	write('Wie is de actor? '), nl,
	read(B),nl,
	write('Wat is de action? input tussen aanhalingstekens '), nl,
	read(C), nl,
	write('Wat is de locatie? indien onbekend, typ nb: '),nl,
	read(D), nl,
	write('Wat is de begintijd? in viercijferige code. nb voor onbekend: '),nl,
	read(E), nl, 
	write('Wat is de eindtijd? in viercijferige code. nb voor onbekend: '),nl,
	read(F),nl,
	assert(event(NewN,B,C,D,E,F)),
	adder(NewN),
	go.
	
	

%4. display potential conflicts or inconsistencies
%menu(4):-

%5. display timeline
menu(5):-
	findNext(01, L, []), 
	length(L, I), 
	I >= 13,
	nl, nl,
	pp(L), flush, 
	fail.
 	%write('Vanaf welk event wilt u beginnen met redeneren? toets een nummer in'),nl,nl,
 	%read(Start),
	%write('Type nu START'),nl,
	%read(START),
 	%returnTimeLines.%(Start, START).




%6. display all evidence supporting particular event
menu(6):- 
	nl,nl,write('Over welk event wilt u meer weten? toets een nummer in'),nl,nl,
 	read(A),
	(   event(A,B,C,D,E,F),!,nl,nl,
	    write('hieronder alle informatie over eventnummer '), write(A),nl,
	    write('(nb staat voor niet bekend)'),nl,nl,
	    write('Actor: '), write(B),nl,
	    write('Action: '), write(B), write(' '), write(C),nl,
	    write('Location: '), write(D),nl,
	    write('Begintijd: '), write(E),nl,
	    write('Eindtijd: '), write(F),nl,
	    go
	);
	(   nl,nl,write('dit eventnummer bestaat niet, probeer het nog eens.'),
	    menu(6)
	).

menu(_):-
	go.

%submenu voor 2
menu2(0):-
	go.

menu2(1):-
	write('Hieronder alle Eventnummers:'),nl,nl,
	findall(A,event(A,_,_,_,_,_), List),
	list_to_set(List, Set),
	pp(Set),
	menu(2).

menu2(2):-
	write('Hieronder alle actors:'),nl,nl,
	findall(B, event(_,B,_,_,_,_), List),
	list_to_set(List, Set),
	delete(Set, nb, Set2),
	pp(Set2),
	menu(2).

menu2(3):-
	write('Hieronder alle acties: '), nl, nl,
	findall([B,C], event(_,B,C,_,_,_), List),
	list_to_set(List, Set),
	delete(Set, nb, Set2),
	pp(Set2),
	menu(2).

menu2(4):-
	write('Hieronder alle locaties: '), nl, nl,
	findall(D, event(_,_,_,D,_,_), List),
	list_to_set(List, Set),
	delete(Set, nb, Set2),
	pp(Set2),
	menu(2).

menu2(5):-
	write('Hieronder alle tijden (Begintijd, Eindtijd): '), nl, nl,
	findall([E,F], event(_,_,_,_,E,F), List),
	list_to_set(List, Set),
	delete(Set, nb, Set2),
	pp(Set2),
	menu(2).

menu2(_):-
	write('Geen geldige optie, kies opnieuw: '),nl,nl,
	menu(2).

adder(NewN):-
	nl,nl,write('is er bekend of dit event voor/na een bestaand event plaatsvind? (j/n)'),nl,
	read(X),
	(   member(X, [j,n]),!,
	    adder(NewN,X)
	);
	(   write('ongeldige invoer, probeer opnieuw'),
	    adder(NewN)
	).

adder(_,n):-
	nl,nl,write('u wordt nu teruggebracht naar het hoofdmenu, event toegevoegd'),nl,
	go.

adder(NewN,j):-
	nl,nl,write('staat dit event voor of na een ander event, of beide? (voor/na/beide)'),nl,
	read(X),
	(   member(X, [voor,na,beide]),!,
	    adder(NewN,X)
	);
	(   write('ongeldige invoer, probeer opnieuw'),nl,
	    adder(NewN,j)
	).

adder(NewN,voor):-
	nl,nl,write('voor welk bestaand event staat dit nieuwe event? (geef eventnummer)'),nl,
	read(X),
	findall(N, event(N,_,_,_,_,_), Ns),
	(   member(X,Ns),!,
	    assert(volgorde(NewN,X)),
	    nl, write('eventnummer '), write(NewN), write('is toegevoegd voor eventnummer '), write(X)
	);
	(   write('dit eventnummer bestaat niet, probeer opnieuw'),nl,
	    adder(NewN,voor)
	).

adder(NewN,na):-
	nl,nl,write('na welk bestaand event staat dit nieuwe event? (geef eventnummer)'),nl,
	read(X),
	findall(N, event(N,_,_,_,_,_), Ns),
	(   member(X,Ns),!,
	    assert(volgorde(X,NewN)),
	    nl, write('eventnummer '), write(NewN), write('is toegevoegd na eventnummer '), write(X)
	);
	(   write('dit eventnummer bestaat niet, probeer opnieuw'),nl,
	    adder(NewN,na)
	).

adder(NewN, beide):-
	adder(NewN,voor),
	adder(NewN,na).

	


%returnTimeLines(Start, L):-
	%write('Voor een alternatieve tijdslijn, druk op ; anders ENTER'),nl,nl,
	%write('Hierna zal het programma afsluiten.'),nl,
	%write('Typ START om te beginnen: '),nl,
	%read('START'),
	%findNext(Start, L, []),
	%write('type findNext(EVENTNUMMER, L, []), waarbij EVENTNUMMER '),nl,
	%write('het event is waarvan je wilt beredeneren in integers'),nl,
	%write('het programma sluit hierna af.').

%returnTimeLines(Start, Count):-
% 	retractall(countLine(_)),
% 	assert(countLine(Count)),
% 	findall(List, returnTimeLine(Start, List), L),
% 	pp(L).
% 
% 
%returnTimeLine(Start, List):-
% 	retractall(countLine(_)),
% 	assert(countLine(Count)).


%probeersel(Start, Amount, List):-
%	retractall(lineCount(_)),
%	assert(lineCount(Amount)),
%	lineCount(X), write(X), nl,nl,nl,nl,nl,nl,nl,nl,
%	findall(List, findNext(Start, List, []), L),
%	write(L).

% %retourneert tijdslijn
% returnTimeLine(_, 0):- !.
% 
% returnTimeLine(Start, Amount):-
% 	findNext(Start, List, []),
% 	nl,nl,
% 	pp(List),
% 	
% 	NewAmount is Amount-1, 
% 	returnTimeLine(Start, NewAmount).

%findduring
findNext(Nummer, [Sentence|Tail], EventList):-
	%lineCount(Q),
	%Q>0,
	event(Nummer, Actor, Eventstring, _, Bmin, Emax),
	event(N, _, E, _, B, E),
	\+ member(N, EventList),
	\+ Emax = nb,
	\+ Bmin = nb,
	\+ B = nb,
	\+ E = nb,
	(
	 (	Bmin<B, 
		E<Emax,
		List = ['ondertussen gebeurt het volgende: ', Eventstring,' door ', Actor],
		concat_atom(List, Sentence),
		%write(Sentence),nl,
		findNext(N, Tail, [N|EventList]) %?????
		
	 )
	%;
	 %fail
	).

%findcommonsenseorder
findNext(Nummer, [Sentence|Tail], EL):-
	%lineCount(Q),
	%Q>0,
	na(Nummer, NaNum), 
	event(Nummer, Actor, Event,_,_,_),
	event(NaNum, A, E , _, _,_),
	\+ member(NaNum, EL),
	List = ['na: ', Actor,' ', Event, ', volgt: ',A,' ', E],
	concat_atom(List, Sentence),
	%write(Sentence),nl,
	findNext(NaNum, Tail, [NaNum|EL]).

findNext(Nummer, [Sentence|Tail], EL):-
	%lineCount(Q),
	%Q>0,
	zelfde_event(Nummer, NaNum),%!,
	event(Nummer, Actor, Event,_,_,_),
	event(NaNum, A, E , _, _,_),
	\+ member(NaNum, EL),
	List = ['Het event: ', Actor,' ', Event, ' is gelijk aan: ', A,' ', E],
	concat_atom(List, Sentence),
	%write(Sentence),nl,
	findNext(NaNum, Tail, [NaNum|EL]).
		

%findoverlap	
findNext(Nummer, [Sentence|Tail], EL):-
	%lineCount(Q),
	%Q>0,
	event(Nummer, Actor, Eventstring, _, Bmin, Emax),
	event(N, A, E, _, B, E),
	\+ member(N, EL),
	\+ Emax = nb,
	\+ Bmin = nb,
	\+ B = nb,
	\+ E = nb,
	(
	  (Bmin=<B, B=<_, E>Emax,
	   List =['terwijl: ', Actor,' ', Eventstring, ', gebeurt: ',A,' ', E],
	concat_atom(List, Sentence),
	%write(Sentence),nl,
	findNext(N, Tail, [N|EL])
	
	  )
	%;
	%findNext(Nummer, Tail)
	).

%findafter
findNext(Nummer, [Sentence|Tail], EL):-
	%lineCount(Q),
	%Q>0,
	event(Nummer, Actor, Eventstring, _, _, Emax),
	event(N, A, E, _, B, _),
	\+ member(N, EL),
	\+ Emax = nb,
	%\+ Bmin = nb,
	\+ B = nb,
	%\+ Em = nb,
	(
	  (B>=Emax,
	   List = ['Na dit: ', Actor,' ', Eventstring, ', volgt: ',A,' ', E], 
	  concat_atom(List, Sentence),
		%write(Sentence),nl,
		findNext(N, Tail, [N|EL])
			
	  )
	%;
	%findNext(Nummer)
	).	

findNext(_, [], _).
	%lineCount(Count),nl,nl,nl,nl,write(Count),nl,nl,
	%write('WHAAOOEEEHHAAAA*********************'),nl,nl,
	%NewCount is Count - 1, write(NewCount),nl,nl,
	%retractall(lineCount(_)),
	%assert(lineCount(NewCount)),
	%lineCount(X), write(X), nl,nl,nl,nl,nl,nl.









































