package library.core.model;

import java.util.ArrayList;

import library.core.system.CoreImageData;

/**
 * アニメーションデータ
 * @author 貴裕
 *
 */
public class CoreAnimation implements Cloneable{

	private String animationName;

	private ArrayList<CoreImageData> animations;	//画像データ
	private ArrayList<Integer> animationIndexs;	//順番データ
	private float speed=1f;
	private boolean isLoop=false;

	private int index;	//何番目のanimationIndexを使用しているか
	private int nextAnimationIndex=-1;	//次の別のアニメーションのID

	private CoreAnimationModel palent;

	private float time=0;

	private boolean endAnim=false;	//アニメーションが終了しているかどうか



	/**
	 * 次のアニメーションが決まっていない奴用
	 * @param name　　　識別用の名前　endAnimation(CoreAnimationModel)などで使いたいときに設定するため、なんでもよい
	 * @param animations
	 * @param indexs
	 * @param speed
	 * @param isLoop
	 */
	public CoreAnimation(String name,ArrayList<CoreImageData> animations,ArrayList<Integer> indexs,float speed,boolean isLoop){
		this.animations=animations;
		this.animationIndexs=indexs;
		this.speed=speed;
		this.isLoop=isLoop;

		this.animationName=name;

		index=0;
	}

	/**
	 * 次のアニメーションが決まっている奴用
	 * @param name　　識別用の名前　endAnimation(CoreAnimationModel)などで使いたいときに設定するため、なんでもよい
	 * @param animations
	 * @param indexs
	 * @param speed
	 * @param isLoop
	 * @param nextAnimId
	 */
	public CoreAnimation(String name,ArrayList<CoreImageData> animations,ArrayList<Integer> indexs,float speed,boolean isLoop,int nextAnimId){
		this.animations=animations;
		this.animationIndexs=indexs;
		this.speed=speed;
		this.isLoop=isLoop;

		this.animationName=name;

		index=0;
		this.nextAnimationIndex=nextAnimId;
	}

	@Override
	public CoreAnimation clone(){
		CoreAnimation c=null;

		try {
			c=(CoreAnimation)super.clone();
			c.animations=new ArrayList<CoreImageData>();
			for(int i=0;i<this.animations.size();i++){
				c.animations.add(this.animations.get(i).clone());
			}

			c.animationIndexs=new ArrayList<Integer>();
			for(int i=0;i<this.animationIndexs.size();i++){
				c.animationIndexs.add(this.animationIndexs.get(i));
			}

			c.animationName=this.animationName;

			//palentのクローンの処理は親の方でやる

		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}

		return c;
	}



	/**
	 * 内部処理 （別のアニメーションに移った場合に呼ばれる）
	 */
	public void changeAnimation(){
		index=0;
		time=0;
	}

	/**
	 * 更新処理
	 * @param deltaTime
	 */
	public void upDate(float deltaTime){

		//再生するアニメーションがすべて終わった場合は最後の画像で停止
		if(endAnim) return;


		time+=deltaTime;

		if(time>=speed){
			time=0;
			index++;
			if(index>animationIndexs.size()-1){

				if(isLoop){
					index=0;
				}else{
					endAnim=true;	//ループしない場合はアニメーションの終了処理


					//アニメーションがループしなく次のアニメーションがある場合は変更
					if(nextAnimationIndex!=-1){
						palent.changeAnimation(nextAnimationIndex);
					}else{
						index-=1;
					}
				}
			}
		}

	}


	/**
	 * 内部処理用　（coreAnimationModelの初期化時に呼ばれる）
	 * @param palent
	 */
	public void setPalent(CoreAnimationModel palent){
		this.palent=palent;
	}

	/**
	 * 画像データの取得
	 */
	public CoreImageData getImage(){
		return 	this.animations.get(animationIndexs.get(index));
	}



	public boolean isLoop() {
		return isLoop;
	}

	public void setLoop(boolean isLoop) {
		this.isLoop = isLoop;
	}

	public int getNextAnimationIndex() {
		return nextAnimationIndex;
	}

	public void setNextAnimationIndex(int nextAnimationIndex) {
		this.nextAnimationIndex = nextAnimationIndex;
	}

	public String getAnimationName() {
		return animationName;
	}

	public void setAnimationName(String animationName) {
		this.animationName = animationName;
	}

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}






}
