/*************************************************************************

         name: semsort_player.pl 
	 date: 2004-10-25
       author: Andreas Wallentin
 
*************************************************************************/
:-multifile sem_sort/2.

:- ensure_loaded( stations_player ).
:- use_module( dbase, [song_list/1,
		       group_in_db/1,
		       album_in_db/1,
		       station_in_db/1] ).

:- ensure_loaded( [albums,songs,groups,digits_svenska_player,digits_english_player] ).
:- use_module(library(lists),[append/3,
			      member/2,
			      is_list/1]).

/*----------------------------------------------------------------------
    sort_restr( +Prop )

    Prop fulfils the sortal restrictions on propositions
----------------------------------------------------------------------*/

sem_sort( english, language ).
sem_sort( svenska, language ).

sem_sort( player, domain ).

% sem_sort(Name,name):-
% 	name(Name).

%%%   ACTIONS
sem_sort( restart,           action ).
sem_sort( handle_player,     action ).
sem_sort( handle_playlist,   action ).
sem_sort( handle_stations,   action ).

sem_sort( start,             action ).
sem_sort( start_specific,    action ).
sem_sort( stop,              action ).
sem_sort( pause,             action ).
sem_sort( resume,            action ).
%sem_sort( fast_rewind,       action ).
%sem_sort( play_playlist,     action ).
sem_sort( fast_forward,      action ).
sem_sort( rewind,            action ).

sem_sort( playlist_add,      action ).
sem_sort( playlist_del,      action ).
%sem_sort( playlist_del_specific,  action ).
%sem_sort( playlist_shuffle,  action ).
sem_sort( remove,            action ).
sem_sort( listen_to,         action ).

sem_sort( vol_up,            action ).
sem_sort( vol_down,          action ).
sem_sort( next_song,         action ).
sem_sort( previous_song,     action ).

sem_sort( show_list,         action ).
%
%%%
%%%%% anv�nd dbase f�r att kolla album, grupper osv...
%%%
%

% sem_sort( radio, jpp ).
% sem_sort( music, jpp ).

%sem_sort( ToPlay, toPlay ):-
%	approved_item(ToPlay).

sem_sort( ToPlay, index ):-
	(
	  approved_item(ToPlay)
	;
	  fix_item(ToPlay,_)
	)
	;
	(
	  approved_item_eng(ToPlay)
	;
	  fix_item_eng(ToPlay,_)
	).


sem_sort( Station, station ):-
	validIP(Station),
	station_in_db(Station).
sem_sort( Station, station ):-
	is_list(Station),
	station_in_db(Station).

sem_sort( ListName, playlist ):-
	correct_playlist_end(ListName).

% [stalker]
sem_sort( X, item ):-
	song2(X).

%sem_sort( X, itemRem ):-
%	integer(X).

sem_sort( X, year ):-
	X = tre
	; X = fyra
	; X = fem
	; X = not_known.

sem_sort( Group, group ):-
	(
	  group(Group)
	;
	  group_atom(Group)
	).
%	( group_in_db(Group)
%	; group_atom(Group)
%	).

sem_sort( Album, album ):-
	( album_in_db(Album)
	; album_atom(Album)
	).

sem_sort( X, song ):-
	( X = [X1,Y],
	    atomic(X1),
	    atomic(Y)
	;
	    song_atom(X)
	).

%sem_sort( X, song ):-
%	song_atom(X).


%%% bara en liten koll mot alla l�tar i DB
%%% skall egentligen vara en "db" med alla
%%% m�jliga l�tar som finns
song2( X ):-
	song_list(SongList),
	song_list2(SL2),
	(
	  member(X,SongList)
	;
	  member(X-_Art,SL2)
	).


/*--------------------
conceptual hierarichy
--------------------*/

%isa(station,item).
isa(itemAdd,item).
%isa(itemRem,item).
isa(song,item).

isa(itemRem,index).
isa(what_to_play,index).

%isa(solo,artist).
isa(artist,group).
isa(song_artist,group).

%isa(artist,artist).
isa(groupToAdd,group).
isa(composer,group).

isa(genreOfArtist, genre).
isa(genreOfMusic, genre).


isa( T0, T2 ):-
	T0 \= T2,
	isa( T0, T1 ),
	isa( T1, T2 ).


%validIP('192.168.0.171').
%   or
%validIP('127.16.60.17:1234').
%number_chars(Number,NumberCharList)
validIP(IPAtom):-
	atomic(IPAtom),
	name(IPAtom,ListOfNumCodes),
	splitList(ListOfNumCodes,[N1,N2,N3,N4]),
	integer(N1),
	integer(N2),
	integer(N3),
	integer(N4).

validIP(IPAtom):-
	atomic(IPAtom),
	name(IPAtom,ListOfNumCodes),
	splitList(ListOfNumCodes,[N1,N2,N3,N4,Port]),
	integer(N1),
	integer(N2),
	integer(N3),
	integer(N4),
	integer(Port).

splitList(CodeList,[N1,N2,N3,N4]):-
	append(First,[46|Rest],CodeList),
	append(Second,[46|Rest2],Rest),
	append(Third,[46|Fourth],Rest2),
	number_chars(N1,First),
	number_chars(N2,Second),
	number_chars(N3,Third),
	number_chars(N4,Fourth).

splitList(CodeList,[N1,N2,N3,N4,Port]):-
	append(First,[46|Rest],CodeList),
	append(Second,[46|Rest2],Rest),
	append(Third,[46|Rest3],Rest2),
	append(Fourth,[58|P_no], Rest3),
	number_chars(N1,First),
	number_chars(N2,Second),
	number_chars(N3,Third),
	number_chars(N4,Fourth),
	number_chars(Port,P_no).


% correct_playlist_end( ListName ):-
% 	atomic(ListName),
% 	name(ListName,ListNameChars),
% 	name('.m3u',M3UChars),
% 	(
% 	  ends_with(ListNameChars,M3UChars)
% 	->
% 	  true
% 	;
% 	  false
% 	).

% correct_item_end( ItemName ):-
% 	atomic(ItemName),
% 	format("itemname ~w~n",[ItemName]),
% 	name(ItemName,ItemNameChars),
% 	ends(AltList),
% 	member(End,AltList),
% 	name(End,Mp3Chars),
% 	(
% 	  ends_with(ItemNameChars,Mp3Chars)
% 	->
% 	  true
% 	;
% 	  false
% 	).

correct_playlist_end([_,punkt,mtreu]).
correct_item_list([_,punkt,mptre]).
correct_item_list([_,punkt,au]).
%%% approved music file extensions
ends(['.mp3','.wav','.au']).

ends_with( ListNameChars, EndChars ):-
	append(_,Ends,ListNameChars),
	EndChars = Ends.

%%% approved_item(+WhatToPlay)
approved_item(ListToPlay):-
%	format("vad kommer?:: ~w\n",[ListToPlay]),
	(
	  ListToPlay = [n�sta]
	;
	  ListToPlay = [f�reg�ende]
	;
	  ListToPlay = [nummer,XX],
	  number_phrase([XX],X),
%	  format("spela nummer:: ~w\n",[X]),
	  integer(X)
	).

%%% fix_item(+RemItemList, -Index)
fix_item(List,Index):-
	(
	  List = [nummer,X],
	  number_phrase([X],Index)
	;
	  List = [den,XOrd],
	  (
	    XOrd = f�rsta,
	    Index = 1
	  ;
	    XOrd = andra,
	    Index = 2
	  ;
	    XOrd = tredje,
	    Index = 3
	  ;
	    XOrd = fj�rde,
	    Index = 4
	  ;
	    XOrd = femte,
	    Index = 5
	  ;
	    XOrd = sj�tte,
	    Index = 6
	  ;
	    XOrd = sjunde,
	    Index = 7
	  ;
	    XOrd = �ttonde,
	    Index = 8
	  ;
	    XOrd = nionde,
	    Index = 9
	  ;
	    XOrd = tionde,
	    index = 10
	  )
	).

%%% approved_item(+WhatToPlay)
approved_item_eng(ListToPlay):-
%	format("vad kommer?:: ~w\n",[ListToPlay]),
	(
	  ListToPlay = [next]
	;
	  ListToPlay = [previous]
	;
	  ListToPlay = [number,XX],
	  number_phrase_eng([XX],X),
%	  format("spela nummer:: ~w\n",[X]),
	  integer(X)
	).

%%% fix_item(+RemItemList, -Index)
fix_item_eng(List,Index):-
	(
	  List = [number,X],
	  number_phrase_eng([X],Index)
	;
	  List = [the,XOrd],
	  (
	    XOrd = first,
	    Index = 1
	  ;
	    XOrd = second,
	    Index = 2
	  ;
	    XOrd = third,
	    Index = 3
	  ;
	    XOrd = fourth,
	    Index = 4
	  ;
	    XOrd = fifth,
	    Index = 5
	  ;
	    XOrd = sixth,
	    Index = 6
	  ;
	    XOrd = seventh,
	    Index = 7
	  ;
	    XOrd = eighth,
	    Index = 8
	  ;
	    XOrd = ninth,
	    Index = 9
	  ;
	    XOrd = tenth,
	    index = 10
	  )
	).



