
rhea_chebi(R,C,input,Num) :-
        event_input(R,I,Num),
        snapshot_continuant(I,C1),
        entity_xref(C1,C).
rhea_chebi(R,C,output,Num) :-
        event_output(R,I,Num),
        snapshot_continuant(I,C1),
        entity_xref(C1,C).

rdir(R,Dir) :-
        entity_comment(R,C),
        atom_concat('RHEA:Direction=',Dir,C).

is_transport(R) :-
        entity_comment(R,'RHEA:Transport=true').

is_simple(R) :-
        \+ is_transport(R).


wfacts :-
        fact(F),
        format('~q.~n',[F]),
        fail.

fact(F ) :-
        facts(L),
        member(F,L).





fact( metadata_db:entity_comment(R,C) ) :-
        entity_comment(R,C),
        \+ \+ rhea_chebi(R,_,_,_).


facts( [ontol_db:class(ID), metadata_db:entity_label(ID,'substance set')] ) :- substance_set(ID).

facts( L ) :-
        setof(C-Num,rhea_chebi(R,C,_D,Num),ChemSet),
        is_simple(R),
        facts_chemset(ChemSet, L).


facts( L ) :-
        setof(C-Num,rhea_chebi(R,C,_D,Num),ChemSet),
        is_simple(R),
        rdir(R,bidirectional), % TODO - other directions
        chemset_id(ChemSet, GID),
        L = [
             ontol_db:class(R),
             ontol_db:genus(R, 'GO:0003824'),
             ontol_db:differentium(R, has_substance_bag, GID)
             ].


facts_chemset( ChemSet, [ ontol_db:class(ID), ontol_db:genus(ID, Genus), metadata_db:entity_label(ID,Label) ] ) :-
        substance_set(Genus),
        chemset_id(ChemSet, ID),
        chemset_label(ChemSet, Label).

% TODO - rather than being a subclass of the chem it should be a subclass of a set with member part chem
facts_chemset( ChemSet, [ ontol_db:class(ChemNumID), metadata_db:entity_label(ChemNumID, Label), ontol_db:subclass(ChemNumID, Chem) ] ) :-
        member(Chem-Num,ChemSet),
        chem_num_id(Chem,Num,ChemNumID),
        class(Chem,CN),
        concat_atom([CN,stoichiometry,Num],' ',Label).
        
%facts_chemset( ChemSet, [ ontol_db:differentium(ID, card(has_member_part,Num), Chem) ]) :-
%        chemset_id(ChemSet, ID),
%        member(Chem-NumAtom,ChemSet),
%        atom_number(NumAtom,NumFloat),
%        floor(NumFloat,Num),

facts_chemset( ChemSet, [ ontol_db:differentium(ID, has_member_part, ChemNumID) ]) :-
        chemset_id(ChemSet, ID),
        member(Chem-Num,ChemSet),
        chem_num_id(Chem,Num,ChemNumID).

chem_num_id(Chem, Num, ID) :-
        concat_atom([Chem,'-stoic-',Num], ID).



chemset_id(ChemSet, ID) :-
        maplist(pair_id,ChemSet,Parts),
        concat_atom(Parts,-,Local),
        atom_concat('CHEBIX:',Local,ID).

pair_id(Chem-Num,ID) :-
        concat_atom([_,Local],:,Chem),
        concat_atom([Local,Num],-,ID).

chemset_label(ChemSet, N) :-
        maplist(pair_label,ChemSet,Parts),
        concat_atom(Parts,' + ',N).

pair_label(Chem-Num,ID) :-
        (   class(Chem,N)
        ->  true
        ;   N=Chem),
        concat_atom([N,Num],-,ID).

substance_set('CHEBIX:0000001').