%% This is a variants of the tool_palette but which works on
%% a constrained basis. ( test for PW3 )
dtf_palette(initialize):-
	to_bb(mk_area, transaction),
	to_bb(update_me, transaction, transaction),
	ask_usr(enter),
	to_bb(application_dialog, token_move, enter),
	assert(last_run(enter, ' PW enter')),
	chat_usr([
		'Please select START when you are ready...',
		' ']).
enter(on):-
	next(enter, _Nextlist),
	next_trn(enter, _trnlist),
	ask_usr(enter, off),
	unask_usr(enter),
	to_bb(application_dialog, token_move, _trnlist),
	offer_choice(_Nextlist),
	chat_usr([
		'Initial tools for this design session are....',
		' ']).
	
%% match some buttons in the forms...
archcad(on):-
	design_function(start, archcad, 'architectural cad').
archcad_complete(_Return):-
	design_function(complete, archcad, _Return).
archcad_aborted(_Return):-
	design_function(aborted, archcad, _Return).
	
archcad_online(on):-
	design_function(start, archcad_online, 'online architectural cad').
archcad_online_complete(_Return):-
	design_function(complete, archcad_online, _Return).
archcad_online_aborted(_Return):-
	design_function(aborted, archcad_online, _Return).

zip(on):-
	design_function(start, zip, 'thermal cad'),
	chat_usr([
		'Please define zones and save as esp-r format before exiting.',
		' ']).
zip_complete(_Return):-
	design_function(complete, zip, _Return).
zip_aborted(_Return):-
	design_function(aborted, zip, _Return).

attribute(on):-
	design_function(start, attribute, 'attribute specification '),
	chat_usr([
		'The intrinsic CAD features in the ESP-r package will now',
		'be used to define problem attributes. Please',
		'remember to save before exiting.',
		' ']).
attribute_complete(_Return):-
	design_function(complete, attribute, _Return).
attribute_aborted(_Return):-
	design_function(aborted, attribute, _Return).

network(on):-
	design_function(start, network, 'network definitions'),
	chat_usr([
		'Please define components and save before exiting.',
		' ']).
network_complete(_Return):-
	design_function(complete, network, _Return).
network_aborted(_Return):-
	design_function(aborted, network, _Return).

conformance(on):-					%% button name
	design_function(start, conformance, 'building regs conformance check').
conformance_complete(_Return):-
	design_function(complete, conformance, _Return).
conformance_aborted(_Return):-
	design_function(aborted, conformance, _Return).

thermaleval(on):-
	design_function(start, thermaleval, 'energy evaluation').
thermaleval_complete(_Return):-
	design_function(complete, thermaleval, _Return).
thermaleval_aborted(_Return):-
	design_function(aborted, thermaleval, _Return).

tsbi3(on):-
	design_function(start, tsbi3, 'energy evaluation').
tsbi3_complete(_Return):-
	design_function(complete, tsbi3, _Return).
tsbi3_aborted(_Return):-
	design_function(aborted, tsbi3, _Return).

lighting_sim(on):-
	design_function(start, lighting_sim, 'lighting evaluation').
lighting_sim_complete(_Return):-
	design_function(complete, lighting_sim, _Return).
lighting_sim_aborted(_Return):-
	design_function(aborted, lighting_sim, _Return).

team_decision(on):-
	design_function(start, team_decision, 'design team meeting').
team_decision_complete(_Return):-
	design_function(complete, team_decision, _Return).
team_decision_aborted(_Return):-
	design_function(aborted, team_decision, _Return).

lighting_simple(on):-
	design_function(start, lighting_simple, 'daylight factor evaluation').
lighting_simple_complete(_Return):-
	design_function(complete, lighting_simple, _Return).
lighting_simple_aborted(_Return):-
	design_function(aborted, lighting_simple, _Return).

viewer(on):-
	design_function(start, viewer, 'hidden line view').
viewer_complete(_Return):-
	design_function(complete, viewer, _Return).
viewer_aborted(_Return):-
	design_function(aborted, viewer, _Return).

%% for summer overheating analysis
climate(on):-
	design_function(start, climate, 'confirm climate for summer overheating').
climate_complete(_Return):-
	design_function(complete, climate, _Return).
climate_aborted(_Return):-
	design_function(aborted, climate, _Return).

so_simulator(on):-
	design_function(start, so_simulator, 'summer simlation of current problem').
so_simulator_complete(_Return):-
	design_function(complete, so_simulator, _Return).
so_simulator_aborted(_Return):-
	design_function(aborted, so_simulator, _Return).

find_worst(on):-
	design_function(start, find_worst, 'locate worst zone in problem').
find_worst_complete(_Return):-
	design_function(complete, find_worst, _Return).
find_worst_aborted(_Return):-
	design_function(aborted, find_worst, _Return).

show_graphs(on):-
	design_function(start, show_graphs, 'show graphs of worst zone in problem').
show_graphs_complete(_Return):-
	design_function(complete, show_graphs, _Return).
show_graphs_aborted(_Return):-
	design_function(aborted, show_graphs, _Return).

show_balance(on):-
	design_function(start, show_balance, 'show energy in worst zone in problem').
show_balance_complete(_Return):-
	design_function(complete, show_balance, _Return).
show_balance_aborted(_Return):-
	design_function(aborted, show_balance, _Return).

dialog(on):-
	design_function(start, dialog, 'user dialog'),
	chat_usr([
		'Please supply information requested before exiting.',
		' ']).
dialog_complete(_Return):-
	design_function(complete, dialog, _Return).
dialog_aborted(_Return):-
	design_function(aborted, dialog, _Return).

accept(on):-
	design_function(start, accept, 'user confirmation'),
	chat_usr([
		'Please select choice before exiting.',
		' ']).
accept_complete(_Return):-
	design_function(complete, accept, _Return).
accept_aborted(_Return):-
	design_function(aborted, accept, _Return).

session_finish(on):-
	design_function(start, session_finish, 'finish button'),
	chat_usr([
		'Please confirm you wish to end a design session.',
		' ']).
exit(on):-
	ask_usr(exit, off),
	retract_choice,				%%%% turn off all icons
	defocus_concept(design_con),
	focus_user(p_design_type).


design_function(start, _DesignFunction, _Description):-
	retract_choice,				%%%% should only turn off this thread
	ask_usr(_DesignFunction, on),
	to_bb(transaction, start, _DesignFunction),
	assert(runing(_DesignFunction, _Description)),
	next_trn(_DesignFunction, _trnlist),
	assert(shift_transition(_DesignFunction, _trnlist)),	%% remember next transition
	chat_usr([[ _Description, ' is now running.'],
		' ']).

design_function(complete, _DesignFunction, _Return):-
	runing(_DesignFunction, _Description),
	chat_usr([[ _Description, ' finished: ', _Return],
		' ']),	%% need to do something with _Return !
	retract(runing(_DesignFunction, _Description)),
	retract(shift_transition(_DesignFunction, _trnlist)),	%% scratch last transition
	retract_choice(_DesignFunction),
	assert(last_run(_DesignFunction, _Description)),
	next(_DesignFunction, _Nextlist),
	next_trn(_DesignFunction, _trnlist),
	to_bb(application_dialog, token_move, _trnlist),
	to_bb(journal, [[ _DesignFunction, ' subsequent tools... ', _Nextlist]]),
	to_bb(journal, [[ _DesignFunction, ' subsequent transition... ', _trnlist]]),
	offer_choice(_Nextlist).

design_function(complete, _DesignFunction, _Return):-
	chat_user([[_DesignFunction, ' complete!']],
		[ ['a design tool has finished - but I do not recall starting it!!'],
		' ']).	%% need to do something with _Return !

design_function(aborted, _DesignFunction, unknown):-
	runing(_DesignFunction, _Description),
	chat_user([[_DesignFunction, 'couldn;t be started:']],
			[['I dont know about any "', _Description, '" tool']]),
	retract(runing(_DesignFunction, _Description)),
	retract_choice(_DesignFunction),
	last_run(_LastFunction, _LastDescription),
	next(_LastFunction, _Nextlist),
	next_trn(_LastFunction, _trnlist),
	to_bb(application_dialog, token_move, _trnlist),
	to_bb(journal, [[ _LastFunction, ' (moved back to) offer tools... ', _Nextlist]]),
	to_bb(journal, [[ _LastFunction, ' shifted back transition... ', _trnlist]]),
	offer_choice(_Nextlist).		%%%% re-offfer previous list!

design_function(aborted, _DesignFunction, _Return):-
	runing(_DesignFunction, _Description),
	to_bb(application_dialog, [[_DesignFunction, ' aborted!']],
			[['"', _DesignFunction, '" aborted: exit code ', _Exit_code]]),
	retract(runing(_DesignFunction, _Description)),
	retract_choice(_DesignFunction),
	last_run(_LastFunction, _LastDescription),
	next(_LastFunction, _Nextlist),
	next_trn(_LastFunction, _trnlist),
	to_bb(application_dialog, token_move, _trnlist),
	to_bb(journal, [[ _LastFunction, ' (moved back after abort) re-offer tools... ', _Nextlist]]),
	to_bb(journal, [[ _LastFunction, ' shifted back transition... ', _trnlist]]),
	offer_choice(_Nextlist).		%%%% re-offfer previous list!

design_function(aborted, _DesignFunction, _Return):-
	chat_user([[_DesignFunction, ' aborted/failed to start!']],
		[ [' a design tool aborted - but I dont recall starting it!!'],
		' ']).

shift_next_trans(_DesignFunction):-		%% within 
	next_trn(_DesignFunction, _trnlist),		%% see if there is a next
	to_bb(application_dialog, token_move, _trnlist),
	to_bb(journal, [[ _DesignFunction, 'z app said shift_next_transition... ', _trnlist]]).

shift_next_trans(_DesignFunction):-		%% within 
	to_bb(journal, [[ ' unknown app said shift_next_transition... ']]).


offer_choice([_Head , _Next|_Rest]):-
	ask_usr(_Head),
	offer_choice([_Next|_Rest]).
offer_choice([_Head]):-
	ask_usr(_Head).
offer_choice([]):-
	defocus_concept(design_con).

retract_choice:-		%% this should match the lib/ac/pw1/kbs/tools_pw3 contents.
	retract_choice(archcad),
	retract_choice(archcad_online),
	retract_choice(zip),
	retract_choice(attribute),
	retract_choice(network),
	retract_choice(conformance),
	retract_choice(thermaleval),
	retract_choice(tsbi3),
	retract_choice(lighting_sim),
	retract_choice(lighting_simple),
	retract_choice(dialog),
	retract_choice(accept),
	retract_choice(exit),
	retract_choice(climate),
	retract_choice(so_simulator),
	retract_choice(find_worst),
	retract_choice(show_graphs),
	retract_choice(show_balance),
	retract_choice(viewer).
retract_choice(_Choice):-
	unask_usr(_Choice).




%% return the list of possible next choices
next(_current, _nextlist):-
	bagof(_next, transition(_current, _next, _trn), _nextlist).
next(_current, _nextlist):-
	_nextlist = [].


%% return the next possible transition
next_trn(_current, _trnlist):-
	transition(_current, _next, _trnlist).
next_trn(_current, _trnlist):-
	_trnlist = [].
