/*********************************************************
       name: device_player.pl
     player: jlGui - audio player (forthcoming)
       date: 2004-10-25
     author: Andreas Wallentin

**********************************************************/
 
:- module( device_dbase, [ dev_set/2,
			   dev_get/2,
			   dev_do/2,
			   %dev_query/2, 
			   dev_query/3, %DH 2003-03-21
			   dev_query_all/3, %DH
			   valid_parameter/1
			 ] ).

resource_of_type(upnp_dev).

:- use_module( library(lists), [ member/2, select/3, is_list/1 ] ).
:- use_module( library(system), [ datime/1 ] ).
:- use_module( library(charsio), [ format_to_chars/3 ] ).
%:- use_module( dbase ).
:- use_module( dbase2).

%%:- ensure_loaded( library(oaag) ).

:- dynamic variable_value/2.
%% also see default_value/2

environment_mode(simulation).
%environment_mode(none).


%init_dbase:-
	%environment_mode(simulation),
	%user:flag( visualize_devices, yes ),
%	!,%trace,
	%ensure_loaded(library(visualization)),
	%gfx_set_initial_values(device_dbase,dbase).

init_dbase:-init. %see end of file


%%% query(+Query, +Parameters)
query( A^albums_by_artist(A),      [artist] ).
query( A^artists_song(A),          [song] ).
query( A^artists_album(A),         [album] ).
query( A^songs_by_artist(A),       [group] ).
query( Path^path(Path),            [group,item] ).


%%% dev_query changed to allow for optional parameters,
%%% perform_query does the trick instead... DH - 21/3-03  

dev_query( Query, Commitments, Answer):-
	query(Query,Vars),
	set_command_variables(Vars,Commitments,_Values),
	perform_query(Query,Answer).

%%% %% Answers == list of answers
%%% dev_query2( Query, Commitments, Answers):-
%%% 	query(Query,Vars),
%%% 	set_command_variables(Vars,Commitments,_Values),
%%% 	perform_query(Query,Answers).

dev_queryAll(Query, Commitments, Answers):-
	query(Query,Vars),
	set_command_variables(Vars,Commitments,_Values),
	setof(A, perform_query(Query, A),Answers ).

perform_query( A^albums_by_artist(A), albums_by_artist(Albums) ):-
	dev_get(artist, Artist ),
	Artist = madonna,
	Albums = the_immaculate_collection.

perform_query( Albums^albums_by_artist(Albums),
	       fail(Albums^albums_by_artist(Albums),no_matches)).

perform_query( A^artists_song(A), artists_song(Artist) ):-
	dev_get(song,Song),
%	findArtistsSong(Song,Artist).
	song(Artist,Song,_).

perform_query( A^artists_album(A), artists_album(Artists) ):-
	dev_get(album,Album),
	%findArtistsAlbum(Album,Artists).
	Album = the_immaculate_collection,
	Artists = madonna.

perform_query( S^songs_by_artist(S), songs_by_artist(Songs) ):-
	dev_get(group,Artist),
	%findSongsArtist(Artist,Songs).
	song(Artist, Songs,_).


%%% Path == 'path/to/song_as_atom'
%%% assume file extension *.mp3
perform_query( Path^path(Path), path(P) ):-
	(
	  dev_get(group,Group),
	  dev_get(item,Song),
	  song(Group,Song,P)
%%% 	  song_by_artist(Song,Group,DefPath),
%%% 	  make_name(Group,G_name),
%%% 	  make_name(Song,S_name),
%%% 	  full_path(DefPath,G_name,S_name,Path),
%%% 	  format("path: ~w\n",[Path]),
%%% 	  Answer = path(Path)
	;
	  P = ''
	  %Answer = not(path(Path))
	  %Answer = fail(Path^path(Path),no_matches)
	).


dev_set(ID,Value1) :-
	environment_mode(simulation),
	interpret_pragmatically(ID,Value1,Value),
%% f�r att rensa gammalt krafs
	try(retract(variable_value(ID,_))),
	assert(variable_value(ID,Value)).
	%( user:flag(visualize_devices,yes) ->
	%    gfx_set_node_value(dbase,ID,Value)
	%;
	%    true
	%).


dev_get(ID,Value) :-
	environment_mode(simulation),
	(
	  variable_value(ID,CurrentValue)
	->
%	  format("device - ~w - ~w~n",[ID,CurrentValue]),
	  Value = CurrentValue
	;
%	  format('fel saker ~a -> ~w\n',[ID,Value]),
	  default_value(ID,Value)
	  
	).
%format(' *** ~a -> ~w\n',[ID,Value]).


dev_do(Command,Commitments) :-
	%error:report(['COMMAND=',Command]),
	%format("~nCOMMITS = ~w~n",[Commitments]),
	%format("~nCOMMAND = ~w~n",[Command]),
	action(Command,Vars),           %% Command = AddContact, Vars = [contactName,number]
	%format("~nLIST = ~w~n",[Vars]), 
	set_command_variables(Vars,Commitments,Values),
	( environment_mode(simulation) ->
	    output_upnp(Command,Values) ;
	    true ),
	perform_command(Command).


set_command_variables([],_,[]).
set_command_variables([Var|Vars],Commitments,[Val|Vals]) :-  %% [Var/contactName, Vars/number]
	Com =.. [ Var, Val ],
%%%   	error:report(['Com=',Com]),
%%%   	error:report(['Var=',Var]),
%%%   	error:report(['Val=',Val]),
%%%  	error:report(['Commits=',Commitments]),
	(
	  member(Com,Commitments)
	;
	  Val = not_known
	),
	dev_set(Var,Val),
	set_command_variables(Vars,Commitments,Vals).

% perform_command( 'SetArtist' ):-
% 	dev_get(dbaseArtist,Name),
% 	format("Du letar efter: ~w",[Name]),
% 	findAlbum(Name,Album),
% 	dev_set(album,Album).


perform_command( _ ) :- true.


interpret_pragmatically(_,V,V).
valid_parameter(_).


output_upnp(Command,Parameters) :-
 	Term =.. [ Command | Parameters ],
 	format('\n[UPnP] ~w\n\n',[Term]).

try(G) :-
	( G -> true ; true ).

%%% path name made for Unix/Linux
%%% assume *.mp3 as file extension
full_path('',_,_,'').
full_path(DefaultPath,G_name,S_name,Path):-
	atom_concat(DefaultPath,G_name,Semi2Path),
	atom_concat(Semi2Path,'/',Semi3Path),
	atom_concat(Semi3Path,S_name,AlmostPath),
	atom_concat(AlmostPath,'.mp3',Path).

:- init_dbase.