% lib_homonyms( Repo ).
% 
% Make files from local directory available as homonyms in Repo
%

lib_homonyms( Repo ) :-
    compound( Repo ),
    !,  % we are within a cell of a pack
    Repo =.. [Pack,Cell],  % fixme: allow more complex terms
    prolog_load_context( directory, Root ),
    directory_file_path( Root, Cell, Coot ),
    atomic_list_concat( [Pack,Cell], '_', Mod ),
    lib_homonyms( Mod, Coot ).

lib_homonyms( Repo ) :-
    prolog_load_context( directory, Root ),
    lib_homonyms( Repo, Root ).

lib_homonyms( Repo, _Root ) :-
    Repo \== user,
    lib_tables:lib_repo_homonyms( Repo, Root ),
    !,
    % fixme: check for errors ?
    Mess = 'Homonyms already loaded for repo: ~w, from source dir: ~w',
    debug( lib, Mess, [Repo,Root] ).
lib_homonyms( Repo, Root ) :-
    directory_file_path( Parent, Base, Root ),
    lib_homonyms_dir( Base, Parent, Root, Repo ),
    asserta( lib_tables:lib_repo_homonyms(Repo,Root) ).

lib_homonyms_dir( prolog, Parent, _FullD, Repo ) :-
    !,
    directory_homonyms_src( Parent, Repo ).
lib_homonyms_dir( _Base, _Parent, FullD, Repo ) :-
    directory_homonyms_src( FullD, Repo ).

directory_homonyms_src( TopD, Repo ) :-
    directory_file_path( TopD, src, SrcD ),
    exists_directory( SrcD ),
    !,
    lib_dir_homonyms_load( Repo, SrcD ).
directory_homonyms_src( TopD, Repo ) :-
    lib_dir_homonyms_load( Repo, TopD ).

lib_dir_homonyms_load( Repo, Root ) :-
    lib_dir_contents( Root, Files, Dirs ),
    maplist( lib_assert_homonym(Repo), Files ),
    lib_dir_homonyms_load_cont( Dirs, Repo ).

lib_dir_homonyms_load_cont( [], _Repo ) :-
    !.
lib_dir_homonyms_load_cont( Dirs, Repo ) :-
    maplist( lib_dir_homonyms_load(Repo), Dirs ).

lib_assert_homonym( Repo, File ) :-
    file_base_name( File, Base ),
    file_name_extension( Stem, pl, Base ),
    !,
    lib_assert_homonym_stem( Stem, Repo, File ).
lib_assert_homonym( _Repo, _File ).

lib_assert_homonym_stem( 'LibIndex', _Repo, _File ) :-
    !.
lib_assert_homonym_stem( Stem, Repo, File ) :-
    assert( lib_tables:lib_homonym(Stem,Repo,File) ).