:- lib( os_odir/2 ).

% should these be library wide defautls
%
os_dir_stem_ext_defaults( Defs ) :-
    Defs = [dir('.'),ext(''),type(file),dir_surpress_ext(true)].

/** os_dir_stem_ext( -Os, +Opts ).

Create an os object (Os) from bits in Opts.

Opts
  * ext(Ext='')
     extension for File
  * dir(Dir='.')
     directory for File (if ODIr is not given)
  * dir_surpress_ext(Dre=true) 
     when true, do not use extension for Os 
  * odir(ODir)
     preferred option when constructing Os
  * stem(Stem)
     stem for Os
  * type(Type=file)
     or dir for directory (type only matters for handling extension)

==
?- os_dir_stem_ext( Os, [stem(file),ext(csv)] ).
Os = file.csv.

?- os_dir_stem_ext( Os, [stem(some_dir),ext(csv),type(dir)] ).
Os = some_dir.
==

@author nicos angelopoulos
@version  0.1 2016/6/24
@version  0.2 2017/7/6, added type() and dir_surpress_ext()
@see module docs (how to cross-ref?)

*/
os_dir_stem_ext( Os, Args ) :-
	options_append( os_dir_stem_ext, Args, Opts ),
	options( stem(Stem), Opts ),
	options( ext(Ext), Opts ),
    options( type(Type), Opts ),
    options( dir_surpress_ext(Surp), Opts ),
    os_dir_stem_ext_type_ext( Type, Surp, Ext, OsExt ),
	os_odir( Odir, Opts ),
	os_dir_stem_ext( Odir, Stem, OsExt, Os ).

os_dir_stem_ext_type_ext( dir, true, _Ext, OsExt ) :-
    !,
    OsExt = ''.
os_dir_stem_ext_type_ext( _, _, Ext, Ext ).

%% os_dir_stem_ext( +Dir, +Stem, +Ext, -File ).
%% os_dir_stem_ext( -Dir, -Stem, -Ext, +File ).
%
% Construct and deconstruct filename File, from  and to components: 
% directory Dir, stem Stem and extension Ext.
%
%==
% ?- os_dir_stem_ext( data/what, file, csv, File ).
% File = data/what/file.csv.
% 
% ?- os_dir_stem_ext( 'data/what', file, csv, File ).
% File = 'data/what/file.csv'.
% 
% ?- os_dir_stem_ext( library(os), file, csv, File ).
% File = library('os/file.csv').
%
% ?- os_dir_stem_ext( Dir, Stem, Ext, library('os/file.csv') ).
% Dir = '/usr/local/users/nicos/local/git/lib/swipl-7.3.16/library/os',
% Stem = file,
% Ext = csv.
% 
% ?- os_dir_stem_ext( dir, stem, ext, /Os ).
% dir/stem.ext.
%
% ?- os_dir_stem_ext( "data/what", file, csv, File ).
% File = "data/what/file.csv".
%
% ?- os_dir_stem_ext( "data/what", file, csv, +File ).
% File = 'data/what/file.csv'.
%==
%
% Note: there is no quarantee the path to the file or the file itself exist.
% 
% Also File, might a relative or absolute reference depending on Dir's disposition.
% 
% @author nicos angelopoulos
% @version  0.3 2016/2/7
% @see was dir_stem_ext_file/4
%
os_dir_stem_ext( Dir, Stem, Ext, Path ) :-
	\+ ground( Path ),
	!,
	os_ext( Ext, Stem, Bname ),
	os_path( Dir, Bname, Path ).

os_dir_stem_ext( Dir, Stem, Ext, Path ) :-
	ground( Path ),
	os_path( Dir, Bname, Path ),
	os_ext( Ext, Stem, Bname ).