package library.core.music;

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

import library.core.debug.CoreLog;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.AudioManager;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;

/**
 * SE用   注意：ループを２つ以上同時に鳴らすとaudiotrackが足りなくなる　
 * 			  ：たぶんsoundPoolを増やすなどすれば何とかなるかも
 * @author 貴裕
 *
 */
public class CoreSePlayer {


	private int size=30;	//同時に鳴らすことのできる音楽数
	private int dataSize=0;
	private boolean isLoadEnd=true;

	private ArrayList<CoreSeData> seDatas;

	private SoundPool soundPool;
	private Context context;

	private boolean isMute=false;

	public CoreSePlayer(Context context){
		this.isLoadEnd=true;
		this.context=context;
		init();

	}

	private void init(){
		soundPool=new SoundPool(size, AudioManager.STREAM_MUSIC, 0);
		soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {

			@Override
			public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
				CoreLog.debugSimple("se load OK"+sampleId+"/"+status);

				if(sampleId>=dataSize-1){
					isLoadEnd=true;
				}
			}
		});
	}


	public void load(ArrayList<CoreSeData> datas){

		this.isLoadEnd=false;

		AssetManager asset=context.getAssets();

		//ＳＥ用データの初期化
		if(this.seDatas!=null) this.seDatas.clear();
		this.seDatas=new ArrayList<CoreSeData>();

		init();

		dataSize=datas.size();

		for(int i=0;i<datas.size();i++){
			try {
				AssetFileDescriptor f=asset.openFd(datas.get(i).getName());
				int id = soundPool.load(f, 1);
				datas.get(i).setSeId(id);
				seDatas.add(datas.get(i));
				CoreLog.debugSimple("se load "+id);
			} catch (IOException e) {
				// TODO 自動生成された catch ブロック
				e.printStackTrace();
			}
		}
	}


	/**
	 * ロードした音を鳴らす
	 * @param myId
	 */
	public void play(int myId){

		if(isMute) return;

		for (CoreSeData d : seDatas) {
			if(d.getMyId()==myId){

				//ループするかどうかによって再生方法が変わる
				if(d.isLoop()){
					if(d.isNowPlaying()){
						soundPool.resume(d.getStreamId());
					}else{
						int streamId=soundPool.play(d.getId(), d.getLeftVolume(), d.getRightVolume(), d.getPriority(),
								d.isLoop()?-1:0, d.getRate());
						d.setStreamId(streamId);
						d.setNowPlaying(true);
					}
				}else{
					if(d.isNowPlaying()){
						//プールの圧迫回避用
						soundPool.stop(d.getStreamId());
						d.setStreamId(soundPool.play(d.getId(), d.getLeftVolume(), d.getRightVolume(), d.getPriority(),
								d.isLoop()?-1:0, d.getRate()));
					}else{
						d.setStreamId(soundPool.play(d.getId(), d.getLeftVolume(), d.getRightVolume(), d.getPriority(),
								d.isLoop()?-1:0, d.getRate()));
						d.setNowPlaying(true);

					}

				}
				break;
			}
		}

	}

	/**
	 * ロードした音を止める
	 * @param myId
	 */
	public void stop(int myId){
		CoreLog.debug("start stop "+myId);
		for (CoreSeData d : seDatas) {
			if(d.getMyId()==myId){

				//ループするかどうかによって停止方法が変わる
				if(d.isLoop()){
					soundPool.pause(d.getStreamId());
					CoreLog.debug("pause "+myId);
				}else{
					soundPool.stop(d.getStreamId());
					d.setNowPlaying(false);
					CoreLog.debug("stop "+myId);
				}
				break;
			}
		}

	}


	/**
	 * すべてのデーターをクリア
	 */
	public void release(){
		this.soundPool.release();
	}


	/**
	 * 内部処理（ロードが終了したかどうか）
	 * @return
	 */
	public boolean isLoadEnd(){
		return isLoadEnd;
	}

	public void setMute(boolean isMute) {
		this.isMute = isMute;

		if(isMute){		//ここちゃんと動くか未確認・・・
			for(int i=0;i<seDatas.size();i++){
			  this.stop(seDatas.get(i).getMyId());
			}
		}
	}



}
