:- module(extract_bad_translation_summary,
	  [extract_bad_translation_summary/2]
	 ).

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

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

extract_bad_translation_summary(InFile, OutFile) :-
	init_extract_bad_translation_summary,
	
	safe_absolute_file_name(InFile, AbsInFile),
	safe_absolute_file_name(OutFile, AbsOutFile),

	prolog_file_to_list(AbsInFile, InList),
	length(InList, NInList),
	format('~N--- Read file (~d records): ~w~n', [NInList, AbsInFile]),

	extract_bad_translations_and_missing_generation_constants(InList),
	
	collect_bad_translations(BadTranslationList),
	length(BadTranslationList, NBadTranslations),

	collect_missing_generation_constants(MissingGenerationConstants),
	length(MissingGenerationConstants, NMissingGenerationConstants),

	NRecords is NBadTranslations + NMissingGenerationConstants,

	open(AbsOutFile, write, S),
	format(S, '~N*** CONSTANTS FAILING TO TRANSLATE ***~n', []),
	print_bad_translations(BadTranslationList, S),
	format(S, '~N*** CONSTANTS MISSING IN GENERATION GRAMMAR ***~n', []),
	print_bad_translations(MissingGenerationConstants, S),
	close(S),
	
	format('~N--- Written bad translation summary (~d records): ~w~n', [NRecords, AbsOutFile]).
extract_bad_translation_summary(InFile, OutFile) :-
	format2error('~N*** Error: bad call: ~w~n',
		     [extract_bad_translation_summary(InFile, OutFile)]),
	fail.

:- dynamic unable_to_translate/1.
:- dynamic missing_generation_constant/1.

init_extract_bad_translation_summary :-
	retractall(unable_to_translate(_)),
	retractall(missing_generation_constant(_)).

extract_bad_translations_and_missing_generation_constants([]).
extract_bad_translations_and_missing_generation_constants([F | R]) :-
	extract_bad_translations_and_missing_generation_constants_from_record(F),
	!,
	extract_bad_translations_and_missing_generation_constants(R).

/*

translation(
    'WH-QUESTION headache become-better sc-when [ you experience what PRESENT ACTIVE ] PRESENT ACTIVE',
    transfer_from_interlingua_failed([if=[clause,[null=[tense,present],unable_to_translate:(arg2=[spec,what]),unable_to_translate:(null=[state,experience]),unable_to_translate:(null=[utterance_type,dcl])]],subject=[symptom,dutong],null=[tense,present],null=[utterance_type,question],unable_to_translate:(null=[event,become_better])]),
    [interlingua=[when=[clause,[arg1=[pronoun,you],arg2=[spec,what],null=[state,experience],null=[tense,present],null=[utterance_type,dcl],null=[voice,active]]],null=[event,become_better],arg1=[secondary_symptom,headache],null=[tense,present],null=[utterance_type,whq],null=[voice,active]]],
    error
  ).

*/

extract_bad_translations_and_missing_generation_constants_from_record(translation(_Source, Target, _Info, _Judgement)) :-
	compound(Target),
	functor(Target, F, 1),
	bad_translation_wrapper(F),
	arg(1, Target, Arg),
	extract_bad_translations_from_record1(Arg),
	!.
extract_bad_translations_and_missing_generation_constants_from_record(translation(_Source, Target, _Info, _Judgement)) :-
	Target = generation_failed(_TargetForm, missing_generation_constants:Constants),
	extract_missing_generation_constants_from_list(Constants),
	!.
extract_bad_translations_and_missing_generation_constants_from_record(_).

bad_translation_wrapper(transfer_from_interlingua_failed).
bad_translation_wrapper(transfer_to_interlingua_failed).
bad_translation_wrapper(transfer_to_source_discourse_failed).

extract_bad_translations_from_record1([]).
extract_bad_translations_from_record1([F | R]) :-
	extract_bad_translations_from_item(F),
	!,
	extract_bad_translations_from_record1(R).

extract_bad_translations_from_item(unable_to_translate:Bad) :-
	assertz(unable_to_translate(Bad)),
	!.
extract_bad_translations_from_item([clause, Clause]) :-
	extract_bad_translations_from_record1(Clause),
	!.
extract_bad_translations_from_item(_Role=[clause, Clause]) :-
	extract_bad_translations_from_record1(Clause),
	!.
extract_bad_translations_from_item(_Other).

extract_missing_generation_constants_from_list([]).
extract_missing_generation_constants_from_list([F | R]) :-
	assertz(missing_generation_constant(F)),
	!,
	extract_missing_generation_constants_from_list(R).

collect_bad_translations(OutList) :-
	findall(Bad,
		unable_to_translate(Bad),
		OutList0),
	list_to_ordered_multiset(OutList0, OutList).

collect_missing_generation_constants(OutList) :-
	findall(Bad,
		missing_generation_constant(Bad),
		OutList0),
	list_to_ordered_multiset(OutList0, OutList).

print_bad_translations([], _S).
print_bad_translations([F | R], S) :-
	print_bad_translation(F, S),
	!,
	print_bad_translations(R, S).

print_bad_translation(Freq-Item, S) :-
	format(S, '~N~d~4|~q~n', [Freq, Item]),
	!.
print_bad_translation(Other, S) :-
	format2error('~N*** Error: bad call: ~w~n',
		     [print_bad_translation(Other, S)]),
	fail.