:- redefine_system_predicate(nl/0).

:- style_check(+string).
:- ensure_loaded('pl-tools.pl').
:- ensure_loaded('supp-format.pl').

message(orm,'',"general order message",
   [msh, opt(rep(nte)), opt(pid, opt(rep(nte)), opt(rep(al1)), opt(pv1)), rep(orc, opt(any, opt(rep(nte)), opt(rep(obx, opt(rep(nte))))), opt(blg))]).
message(orr,'',"general order acknowledgement message",
   [msh, msa, opt(err), opt(rep(nte)), opt(opt(pid, opt(rep(nte))), rep(orc, opt(any), opt(rep(nte))))]).
message(orm,'',"dietary order",
   [msh, opt(rep(nte)), opt(pid, opt(rep(nte)), opt(rep(al1)), opt(pv1)), rep(orc, opt(rep(ods), opt(rep(nte)), rep(obx, opt(rep(nte))))), rep(opt(orc, rep(odt), opt(rep(nte))))]).
message(orr,'',"general order acknowledgement message",
   [msh, msa, opt(err), opt(rep(nte)), opt(opt(pid, opt(rep(nte))), rep(orc, opt(rep(ods)), opt(rep(nte))), opt(rep(orc, opt(rep(odt)), opt(rep(nte)))))]).
message(orm,'',"stock requisition order message",
   [msh, opt(rep(nte)), opt(pid, opt(rep(nte)), opt(rep(al1)), opt(pv1)), rep(orc, opt(rqd, opt(rep(nte)), opt(rep(obx, opt(rep(nte))))), opt(blg))]).
message(orr,'',"general order acknowledgement message",
   [msh, msa, opt(err), opt(rep(nte)), opt(opt(pid, opt(rep(nte))), rep(orc, rqd, opt(rep(nte))))]).
message(orm,'',"nonstock requisition order message",
   [msh, opt(rep(nte)), opt(pid, opt(rep(nte)), opt(rep(al1)), opt(pv1)), rep(orc, opt(rqd, opt(rq1), opt(rep(nte)), opt(rep(obx, opt(rep(nte))))), opt(blg))]).
message(orr,'',"general order acknowledgement message",
   [msh, msa, opt(err), opt(rep(nte)), opt(opt(pid, opt(rep(nte))), rep(orc, rqd, opt(rq1), opt(rep(nte))))]).
message(orm,'',"pharmacy prescription message",
   [msh, opt(rep(nte)), opt(pid, opt(rep(nte)), opt(rep(al1)), opt(pv1)), rep(orc, opt(rxo, opt(rep(nte)), rep(rxr), opt(rep(rxc), opt(rep(nte))), opt(rep(obx, opt(rep(nte))))), opt(blg))]).
message(orr,'',"description",
   [msh, msa, opt(err), opt(rep(nte)), opt(opt(pid, opt(rep(nte))), rep(orc, opt(rxo, opt(rep(nte)), rep(rxr), opt(rep(rxc)), opt(rep(nte)))))]).
message(rde,'',"pharmacy encoded order message",
   [msh, opt(rep(nte)), opt(pid, opt(rep(nte)), opt(rep(al1)), opt(pv1)), rep(orc, opt(rxo, opt(rep(nte)), rep(rxr), opt(rep(rxc), opt(rep(nte)))), rxe, rep(rxr), opt(rep(rxc)), rep(opt(obx), opt(rep(nte))))]).
message(rre,'',"pharmacy encoded order acknowledgement message",
   [msh, msa, opt(err), opt(rep(nte)), opt(opt(pid, opt(rep(nte))), rep(orc, opt(rxe, rep(rxr), opt(rep(rxc)))))]).
message(rds,'',"pharmacy dispense message",
   [msh, opt(rep(nte)), opt(pid, opt(rep(nte)), opt(rep(al1)), opt(pv1)), rep(orc, opt(rxo, opt(rep(nte), rep(rxr), opt(rep(rxc), opt(rep(nte))))), opt(rxe, rep(rxr), opt(rep(rxc))), rxd, rep(rxr), opt(rep(rxc)), rep(obx, opt(rep(nte))))]).
message(rrd,'',"pharmacy dispense acknowledgement message",
   [msh, msa, opt(err), opt(rep(nte)), opt(opt(pid, opt(rep(nte))), rep(orc, opt(rxd, rep(rxr), opt(rep(rxc)))))]).
message(rgv,'',"pharmacy give",
   [msh, opt(rep(nte)), opt(pid, opt(rep(nte)), opt(rep(al1)), opt(pv1)), rep(orc, opt(rxo, opt(rep(nte), rep(rxr), opt(rep(rxc), opt(rep(nte))))), opt(rxe, rep(rxr), opt(rep(rxc))), rep(rxg, rep(rxr), opt(rep(rxc)), rep(opt(obx), opt(rep(nte)))))]).
message(rrg,'',"pharmacy give acknowledgement message",
   [msh, msa, opt(err), opt(rep(nte)), opt(opt(pid, opt(rep(nte))), rep(orc, opt(rxg, rep(rxr), opt(rep(rxc)))))]).
message(ras,'',"pharmacy administration",
   [msh, opt(rep(nte)), opt(pid, opt(rep(nte)), opt(rep(al1)), opt(pv1)), rep(orc, opt(rxo, opt(rep(nte), rep(rxr), opt(rep(rxc), opt(rep(nte))))), opt(rxe, rep(rxr), opt(rep(rxc))), rep(rxa), rxr, rep(opt(obx, rep(opt(nte)))))]).
message(rra,'',"pharmacy administration acknowledgement message",
   [msh, msa, opt(err), opt(rep(nte)), opt(opt(pid, opt(rep(nte))), rep(orc, opt(rep(rxa), rxr)))]).

hl7pp :-
	forall(message(M, E, N, DefL),
	(
	    uppercase(M, UM),
	    uppercase(E, UE),
	    uppercase(N, UN),
	    
	    format("MESSAGE ~w^~w ~20|-- ~w~>", [UM, UE, UN]),
	    
	    hl7pp(DefL),
		    
	    format("~<~c", 12)
	)).

hl7pp([]).
hl7pp([H|T]) :-
	hl7pp1(H),
	hl7pp(T).

hl7pp1(rep(opt(X))) :-
	uppercase(X, UX),
	format("~n{ [ ~w ] }", UX).
hl7pp1(opt(rep(X))) :-
	uppercase(X, UX),
	format("~n[ { ~w } ]", UX).
hl7pp1(rep(X)) :-
	atom(X),
	uppercase(X, UX),
	format("~n{ ~w }", UX).
hl7pp1(opt(X)) :-
	atom(X),
	uppercase(X, UX),
	format("~n[ ~w ]", UX).
hl7pp1(X) :-
	X =.. [rep|A],
	format("~n{~>"),
	hl7pp(A),
	format("~<~n}").
hl7pp1(X) :-
	X =.. [opt|A],
	format("~n[~>"),
	hl7pp(A),
	format("~<~n]").
hl7pp1(X) :-
	X =.. [any|A],
	format("~nANY"),
	anyof(A).
hl7pp1(X) :-
	atom(X),
	uppercase(X, UX),
	format("~n~w", UX).

anyof([]).
anyof(X) :-
	format(" OF"),
	anyof1(X).


anyof1([X]) :-
	uppercase(X, UX),
	format(" ~w", UX).
anyof1([X, Y]) :-
	uppercase(X, UX),
	uppercase(Y, UY),
	format(" ~w AND ~w", [UX, UY]).
anyof1([X|R]) :-
	uppercase(X, UX),
	format(" ~w,", UX),
	anyof1(R).


