:- use_module(library(progress_bar)).

demo_progress_bar :- test_progress_bar(simple,100).
demo_progress_bar :- test_progress_bar(default,100).
demo_progress_bar :- test_progress_bar(fancy,100).

demo_spinner :- test_spinner(simple,100).
demo_spinner :- test_spinner(default,100).
demo_spinner :- test_spinner(fancy,100).

:- multifile
    prolog:message//1.

test_progress_bar(Label,Total) :-
    Sleep is 5 / Total,
    get_time(TS),
    forall(
        (between(1,Total,Index),sleep(Sleep)),
        print_message(informational,pb(demo_progress_bar(Label,Index/Total,TS)))).

test_spinner(Label,Total) :-
    Sleep is 5 / Total,
    get_time(TS),
    forall(
        (between(1,Total,Progress),sleep(Sleep)),
        print_message(informational,pb(demo_spinner(Label,Progress,TS)))).

prolog:message(pb(Msg)) --> Msg.

demo_progress_bar(simple,Progress,_) -->
	{
		Progress = Index/Total
	},
	simple_progress_bar(Index,Total).

demo_progress_bar(default,Progress,TS0) -->
	{
		Progress = Index/Total,
		IntroText = 'default demo ',
		OutroText = pb(running_time(TS0))
	},
	default_progress_bar(Index,Total,IntroText,OutroText).

demo_progress_bar(fancy,Progress,TS0) -->
	{
		Progress = Index/Total,
		IntroText = 'fancy demo ',
		Items = [administration, modernize ,excitement ,valid ,choke ,pigeon ,ministry ,atmosphere ,nominate ,hide ,few ,goalkeeper ,plan ,seminar ,blue ,coma ,incredible ,surprise ,important ,cheat],
		length(Items,N), 
		I is Index mod N, nth0(I,Items,Item),(Index < Total -> format(string(StartText),"Processing: \"~w\" ",[Item]) ; StartText = ""),	
		J is (Index + 1) mod N, nth0(J,Items,Next),(Index < Total ->  format(string(EndText)," Up next: \"~w\" ",[Next]) ; EndText = ""),
		get_time(TS),RunningTime is TS - TS0, format(string(OutroText)," ~2f seconds",[RunningTime]),
		Percentage is (Index/Total) * 100, format(string(TodoText)," ~0f%",[Percentage])
	},
	fancy_progress_bar(Index,Total,IntroText,OutroText,StartText,TodoText,EndText).

running_time(TS0) --> {get_time(TS),RunningTime is TS - TS0},[" ~2f seconds" - [RunningTime]].

demo_spinner(simple,Progress,_) --> simple_spinner(Progress).

demo_spinner(default,Progress,_) --> default_spinner(Progress,"Busy doing great things ").

demo_spinner(fancy,Progress,TS0) -->
	{
		Items = [administration, modernize ,excitement ,valid ,choke ,pigeon ,ministry ,atmosphere ,nominate ,hide ,few ,goalkeeper ,plan ,seminar ,blue ,coma ,incredible ,surprise ,important ,cheat],
		random_member(Item,Items),
		get_time(TS),RunningTime is TS - TS0, format(string(TextRight),"[~2f seconds]",[RunningTime]),
		format(string(TextLeft)," Processing '~w'",[Item])
	},
	fancy_spinner(Progress,TextLeft,TextRight).