package com.test.music;

import java.io.IOException;
import java.util.ArrayList;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.widget.SeekBar;
import android.widget.Toast;
import android.media.MediaPlayer;
import android.media.MediaPlayer.TrackInfo;

public class Playbackservice extends Service implements
		MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
		MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnErrorListener {
	
	private MediaPlayer mp=null;
	private ArrayList<String> slist=new ArrayList<String>();
	private String TAG="Playbackservice";
	
	public int position=0;
	private static final ArrayList<Playsong> sActivities = new ArrayList<Playsong>(5);

	/**
	 * Object used for PlaybackService startup waiting.
	 */
	private static final Object[] sWait = new Object[0];
	/**
	 * The appplication-wide instance of the PlaybackService.
	 */
	public static Playbackservice sInstance;
	
	@Override
	public void onCreate() {
		super.onCreate();
		
		if(null!=Dataengine.songlist&&Dataengine.songlist.size()>0)
		addsong();
		MyDebug.i(TAG,"=========service c lasss in oncreate method=========="+slist.size());
		mp=new MediaPlayer();
		mp.setOnCompletionListener(this);
		mp.setOnPreparedListener(this);
		sInstance=this;
	}

	public void addsong() {
		position=0;
		slist.clear();
		for(int i=0;i<Dataengine.songlist.size();i++){
			slist.add(Dataengine.songlist.get(i));
		}
	}

	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		
		MyDebug.i(TAG,"===========onstartcommand=============");		
		 startplayer();
		return START_STICKY;
	}

	public void startplayer(){
		MyDebug.i(TAG,"============onstartplayer==========");
		 try {
			    mp.reset();
				mp.setDataSource(slist.get(position));
				mp.prepareAsync();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
	}
	
	public void stopplayer(){
		if(null!=mp&&mp.isPlaying()){
			mp.stop();
		}
	}
	
	
	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCompletion(MediaPlayer mp) {
		MyDebug.i(TAG,"=========oncomplete===============");
    if(slist.size()-1>position){
     position+=1;
     startplayer();
    }else{
    	stopplayer();
    	sActivities.get(0).setstate(mp.isPlaying()?1:0);
    }
}

	@Override
	public boolean onError(MediaPlayer mp, int what, int extra) {
		return false;
	}

	@Override
	public void onBufferingUpdate(MediaPlayer mp, int percent) {

	}

	@Override
	public void onPrepared(MediaPlayer mp) {
        mp.start();
        MyDebug.i(TAG,"=========onprepared============");
	}

	/**
	 * Return the PlaybackService instance, creating one if needed.
	 */
	public static Playbackservice get(Context context)
	{
		if (sInstance == null) {
			context.startService(new Intent(context, Playbackservice.class));

			while (sInstance == null) {
				try {
					synchronized (sWait) {
						sWait.wait();
					}
				} catch (InterruptedException ignored) {
				}
			}
		}

		return sInstance;
	}

	/**
	 * Returns true if a PlaybackService instance is active.
	 */
	public static boolean hasInstance()
	{
		return sInstance != null;
	}
	
	public static void addActivity(Playsong activity)
	{
		sActivities.add(activity);
	}

	/**
	 * Remove an Activity from the registered PlaybackActivities
	 *
	 * @param activity The Activity to be removed
	 */
	public static void removeActivity(Playsong activity)
	{
		sActivities.remove(activity);
	}

	public int playerActions() {
		TrackInfo[] aa=mp.getTrackInfo();
	
		  MyDebug.i(TAG,"================playeractoions===========");
		if(null!=mp&&mp.isPlaying()){
			mp.pause();
			return 0;
		}else{
			mp.start();
			return 1;
		}
		
	}

	public void seekto(int sek){
		mp.seekTo(sek);
	}
	
	public int getposition(){
		
		return mp.getCurrentPosition();
		
	}
	
	public int getcomplietposition(){
		return mp.getDuration();
	}
	
	public boolean ispalying(){
		return mp.isPlaying();
	}
	public void shiftcurrentsong(int shiftSong) {
		
		if(shiftSong==1){
			 if(slist.size()-1>position){
			     position+=shiftSong;
			     stopplayer();
					startplayer();
					MyDebug.i(TAG,"================player start next song===========");
		   }else{
			   Toast.makeText(getApplicationContext(),"No songs are avilable",Toast.LENGTH_SHORT).show();
		   }
		
		}else if(shiftSong==-1){
			
			 if(position+shiftSong>=0 && slist.size()-1>position+shiftSong){
			     position+=shiftSong;
			     stopplayer();
					startplayer();
					MyDebug.i(TAG,"================player start previous song===========");
		  }else{
			  Toast.makeText(getApplicationContext(),"No songs are avilable",Toast.LENGTH_SHORT).show();
		  }
		
		}
		 
	}

	
	
}
