% :- lib( replace_non_alphanums/3 ).
:- lib(stoics_lib:at_con/3).

:- ensure_loaded(bio_db_build_organism).
:- ensure_loaded(bio_db_cnm_token).

map_predicate_name_defaults( [db(hgnc),org(homs)] ).

%% map_predicate_name( +Cnm1, +Cnm2, -Pname, +Opts ).
%
% Construct a predicate name, first by looking into Opts for predicate/1
% or by downcasing both, and concatenating Cnm2 to Cnm1.
%
%==
% ?- map_predicate_name( prosqlite, 'GeneID', Pname, [] ).
%
% Pname = hgnc_homs_prosqlite_geneid.
% 
% ?- map_predicate_name( prosqlite, 'GeneID', Pname, [predicate(what)] ).
% Pname = what.
% 
%==
%
% @author nicos angelopoulos
% @version  0.1 2014/7/2
%
map_predicate_name( Comp1, Comp2, Pname, Args ) :-
     Self = map_predicate_name,
     options_append( Self, Args, Opts ),
     map_predicate_name_opts( Comp1, Comp2, Pname, Opts ).

map_predicate_name_opts( _Cnm1, _Cnm2, Pname, Opts ) :-
	memberchk( predicate(Pname), Opts ),
	!.
map_predicate_name_opts( Comp1, Comp2, Pname, Opts ) :-
	% map_predicate_name_token( Comp1, Tkn1, Opts ),
	% map_predicate_name_token( Comp2, Tkn2, Opts ),
     bio_db_cnm_token( Opts, Comp1, Tkn1 ),
     bio_db_cnm_token( Opts, Comp2, Tkn2 ),
     options( org(OrgIn), Opts ),
     bio_db_organism_known( OrgIn, Okn, _Org ),
     options( db(Db), Opts ),
	at_con( [Db,Okn,Tkn1,Tkn2], '_', Pname ),
     !.
     % things should have already error, but to be steadfast: 
map_predicate_name_opts( Comp1, Comp2, _Pname, Opts ) :-
     throw( bio_db_pred_name_fail(Comp1,Comp2), Opts ).

map_predicate_map_prefix( map, Opts ) :-
	options( map_prefix(true), Opts ),
	!.
map_predicate_map_prefix( '', _Opts ).

% map_predicate_name_token( Atom, Comp, Opts ) :-
     % ( cnm_token(Atom,_,Comp) -> true; downcase_atom(Atom,Comp) ).
	% replace_non_alphanums( Down, 0'_, CompCs ),
	% atom_codes( Comp, CompCs ).

%% map_predicate_name_stem( Pname, Stem, Opts ).
%
% Stem is either the argument to stem/1 appearing in Opts or Pname.
% 
%==
% ?- map_predicate_name( pname, Stem, [abc(d),stem(file_stem)] ).
% Stem = file_stem.
%==
%
% @author nicos angelopoulos
% @version  0.1 2014/7/2
%
map_predicate_name_stem( _Pname, Stem, Opts ) :-
	memberchk( stem(Stem), Opts ),
	!.
map_predicate_name_stem( Pname, Pname, _Opts ).
