:- use_module(library(lists)).  % in both SWI and Yap
:- use_module(library(debug)).  % in both SWI and Yap
:- use_module(library(system)). % in both SWI and Yap

:- multifile library_directory/1.
:- dynamic library_directory/1.

assert_model_paths :-
	AbsOpts = [file_type(directory),access(exist),solutions(all)],
	absolute_file_name( bims(models), ModsDir, AbsOpts ),
	directory_files( ModsDir, SubEntries ),
	findall( SubSrc, ( member(SubE,SubEntries),
				 \+ atom_concat( '.', _, SubE ),
				 directory_file_path(ModsDir,SubE,Path),
				 directory_file_path(Path,src,SubSrc),
				 exists_directory(SubSrc),
				 debug(bims,'Asserting model path:~w, at:~w',[SubE,SubSrc] ),
			      assert(user:file_search_path(SubE,SubSrc))
			), _Subs ),
	!.
assert_model_paths :
	debug( bims, 'Failed to assert any model paths', [] ).

:- prolog_load_context( directory, Here ),
   directory_file_path( Top, src, Here ),
   debug( bims, 'Asserting: ~w', Top ),
   assert( user:file_search_path(bims,Top) ),
   atom_concat( Here, '/', HereSl ),
   atom_concat( HereSl, 'lib/on_pl', Pl ),
   ensure_loaded( Pl ),
   assert_model_paths.

:- pl( swi(_A),  ensure_loaded('lib/swi_compat') ).
:- ensure_loaded( 'lib/defines' ).
:- ensure_loaded( 'lib/els' ).
:- ensure_loaded( 'lib/mcmcms_top_dir' ).
:- ensure_loaded( 'lib/elm' ).

:- (current_predicate(lib/1)->true; 
       assert(lib(Lib):-use_module(library(Lib)))
	).

yap_start :-
	use_module( library(lists) ),
	getcwd( D ),
	atom_codes( D, DCs ),
	append( DCs, "/lib", LibCs ),
	atom_codes( Lib, LibCs ),
	assert_lib_dir_if( Lib ),
     % a little bit of a hack, in the long run ask Vitor to change
     % the behaviour of Yap
     assert( portray_message( _X, defined_elsewhere((tmp: :: /2),_Where) ) ),
     set_prolog_flag( unknown, error ),
	set_prolog_flag( single_var_warnings, on ),
	set_prolog_flag( redefine_warnings, on ),
	set_prolog_flag( informational_messages, off ).

sicstus_start :-
	absolute_file_name( 'lib/', Lib ),
	assert_lib_dir_if( Lib ),
	pl_version( sicstus, (3:9:0), NoP=sics38_pncms, NoP=sics39_pncms ),
	pl( sicstus(3:8:_), ensure_loaded(library(sics38_pncms)) ),
	pl( [sicstus(3:9:_),sicstus(3:10:_),sicstus(3:11:_),sicstus(3:12:0),
	     sicstus(3:12:1)],
		ensure_loaded( library(sics39_pncms) ) ),
	pl_version( sicstus, (3:12:2), true, set_prolog_flag(informational,off) ).

/*
swi_start :-
        % absolute_file_name( 'lib/', Lib ),
        prolog_load_context( directory, Dir ),
        atom_concat( Dir, '/lib', Lib ),
        % write( lib(Lib) ), nl,
        assert_lib_dir_if( Lib ).
	   */
swi_start :-
     use_module(library(listing)),
     use_module(library(filesex)),
     true.

assert_lib_dir_if( Lib ) :-
	( ( current_predicate( library_directory, library_directory(_) ),
          % in the long run we would like to remove user: below
          user:library_directory(Lib)) -> 
		true 
		; 
		assertz( user:library_directory(Lib) ) 
	).

compile_pl( File ) :-
     pl( swi(_), consult(File) ),
     pl( yap(_), compile(File) ),
     pl( sicstus(_), compile(File) ).

mcmcms_maintainer( 'nicos.angelopoulos@gmail.com' ).

:- pl( sicstus(_A), sicstus_start ).
:- pl( yap(_A), yap_start ).
:- pl( swi(_A), swi_start ).
:- prolog_load_context( directory, Dir ),
   atom_concat( Dir, '/', DirSl ),
   bims_bb_put( mcmcms_src_dir, DirSl ).