:- module(progress,
	  [get_progress_file_info_for_java_gui/2,

	   set_new_current_progress_file_for_command/1,
	   set_new_current_progress_file_for_command/2,

	   set_current_progress_file/1,
	   get_current_progress_file/1,

	   add_progress_line/1]
	 ).

:- use_module('$REGULUS/Prolog/regulus_utilities').
:- use_module('$REGULUS/PrologLib/utilities').
:- use_module('$REGULUS/PrologLib/batchrec_tools').

:- use_module(library(lists)).
:- use_module(library(system)).
'SICSTUS4ONLY'( ( :- use_module(library(file_systems)) ) ).

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

get_progress_file_info_for_java_gui(Command0, Info) :-
	split_string_into_words(Command0, Command),
	get_progress_file_info_for_command(Command, Info0),
	package_progress_file_info(Info0, Info1),
	Info =.. [progress_files | Info1],
	!.
get_progress_file_info_for_java_gui(_Command, no_progress_info).

package_progress_file_info([], []).
package_progress_file_info([F | R], [F1 | R1]) :-
	package_progress_file_item(F, F1),
	!,
	package_progress_file_info(R, R1).

package_progress_file_item(progress_file(File, N, Pattern),
			   progress_file(FileString, N, PatternString)) :-
	atom(File),
	atom(Pattern),
	atom_codes(File, FileString),
	atom_codes(Pattern, PatternString),
	!.
package_progress_file_item(Item, Item1) :-
	format2error('~N*** Error: bad call: ~w', [package_progress_file_item(Item, Item1)]),
	fail.

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

get_progress_file_info_for_command(['LOAD'],
				   [progress_file(File, 9, '*no_pattern*')]) :-
	get_progress_file('load_progress.txt', File),
	!.
get_progress_file_info_for_command(['EBL_LOAD'],
				   [progress_file(File, 8, '*no_pattern*')]) :-
	get_progress_file('ebl_load_progress.txt', File),
	!.
get_progress_file_info_for_command(['LOAD_TRANSLATE'],
				   [progress_file(File, 17, '*no_pattern*')]) :-
	get_progress_file('load_translate_progress.txt', File),
	!.
get_progress_file_info_for_command(['TRANSLATE_CORPUS'],
				   [progress_file(File, N, '*no_pattern*')]) :-
	user:get_regulus_config_item(translation_corpus, CorpusFile),
	count_records_in_file(CorpusFile, N),
	get_progress_file('translate_corpus_progress.txt', File),
	!.
get_progress_file_info_for_command(['TRANSLATE_CORPUS', Id],
				   [progress_file(File, N, '*no_pattern*')]) :-
	user:get_regulus_config_item(translation_corpus(Id), CorpusFile),
	count_records_in_file(CorpusFile, N),
	format_to_atom('translate_corpus_progress_~w.txt', [Id], BaseFile),
	get_progress_file(BaseFile, File),
	!.
get_progress_file_info_for_command(['TRANSLATE_SPEECH_CORPUS'],
				   [progress_file(BatchrecTraceFile, N, 'Rec Total:'),
				    progress_file(TranslationProgressFile, N, '*no_pattern*')]) :-
	user:get_regulus_config_item(translation_speech_corpus, TranscriptionsFile),
	parse_transcriptions_file_to_list(TranscriptionsFile, List),
	length(List, N),
	user:get_regulus_config_item(batchrec_trace, BatchrecTraceFile),
			    
	get_progress_file('translate_speech_corpus_progress.txt', TranslationProgressFile),
	!.
get_progress_file_info_for_command(['TRANSLATE_SPEECH_CORPUS_AGAIN'],
				   [progress_file(TranslationProgressFile, N, '*no_pattern*')]) :-
	user:get_regulus_config_item(translation_speech_corpus, TranscriptionsFile),
	parse_transcriptions_file_to_list(TranscriptionsFile, List),
	length(List, N),
			    
	get_progress_file('translate_speech_corpus_progress.txt', TranslationProgressFile),
	!.
get_progress_file_info_for_command(['TRANSLATE_SPEECH_CORPUS', Id],
				   [progress_file(BatchrecTraceFile, N, 'Rec Total:'),
				    progress_file(TranslationProgressFile, N, '*no_pattern*')]) :-
	user:get_regulus_config_item(translation_speech_corpus(Id), TranscriptionsFile),
	parse_transcriptions_file_to_list(TranscriptionsFile, List),
	length(List, N),
	user:get_regulus_config_item(batchrec_trace, BatchrecTraceFile),

	format_to_atom('translate_speech_corpus_progress_~w.txt', [Id], BaseFile),
	get_progress_file(BaseFile, TranslationProgressFile),
	!.
get_progress_file_info_for_command(['TRANSLATE_SPEECH_CORPUS_AGAIN', Id],
				   [progress_file(TranslationProgressFile, N, '*no_pattern*')]) :-
	user:get_regulus_config_item(translation_speech_corpus(Id), TranscriptionsFile),
	parse_transcriptions_file_to_list(TranscriptionsFile, List),
	length(List, N),

	format_to_atom('translate_speech_corpus_progress_~w.txt', [Id], BaseFile),
	get_progress_file(BaseFile, TranslationProgressFile),
	!.
get_progress_file_info_for_command(Command, List) :-
	format2error('~N*** Error: bad call: ~w~n',
		     [get_progress_file_info_for_command(Command, List)]),
	fail.

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

set_new_current_progress_file_for_command(Command) :-
	set_new_current_progress_file_for_command(Command, 1).

set_new_current_progress_file_for_command(Command, N) :-
	get_progress_file_info_for_command(Command, Alist),
	safe_nth(N, Alist, progress_file(File, _NLines, _Pattern)),
	set_current_progress_file(File),
	open(File, write, S),
	close(S),
	!.
set_new_current_progress_file_for_command(Command, N) :-
	format2error('~N*** Error: bad call: ~w~n',
		     [set_new_current_progress_file_for_command(Command, N)]),
	fail.
	
%----------------------------------------------------------------------

get_progress_file(Name, AbsFile) :-
	get_tmp_file_directory(Dir),
	format_to_atom('~w/~w', [Dir, Name], File),
	absolute_file_name(File, AbsFile).

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

:- dynamic current_progress_file/1.

set_current_progress_file(File) :-
	absolute_file_name(File, AbsFile),
	retractall(current_progress_file(_)),
	assertz(current_progress_file(AbsFile)).

get_current_progress_file(File) :-
	current_progress_file(File).

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

add_progress_line(Message) :-
	get_current_progress_file(File),
	datime(Datime),
	datime_to_timestamp(Datime, Timestamp),
	open(File, append, S),
	format(S, '~N~q.~n', [progress(Timestamp, Message)]),
	close(S).

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

count_records_in_file(File, N) :-
	prolog_file_or_files_to_list(File, List),
	length(List, N). 

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

get_tmp_file_directory(Dir) :-
	absolute_file_name('$REGULUS/tmp', Dir),
	(   safe_directory_exists(Dir) ->
	    true
	;
	    otherwise ->
	    make_directory(Dir)
	),
	!.
get_tmp_file_directory(Dir) :-
	format2error('~N*** Error: bad call: ~w~n', [get_tmp_file_directory(Dir)]),
	fail.