package library.core.view;

import java.util.ArrayList;

import library.core.mainAI.RiverCrossingAI;
import library.core.model.CoreModel;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;

public class CoreView implements Cloneable{

	private ArrayList<CoreView> hitViews;	//このビューにヒットしているもの
	private CoreModel model;

	private int priority=0; //大きいほど優先度が高く、表に表示される

	private Paint p;

	/**
	 * @param model
	 * @param priority 描画優先度　大きいほど優先度が高く、表に表示される
	 */
	public CoreView(CoreModel model,int priority){
		this.model=model;
		this.priority=priority;

		hitViews=new ArrayList<CoreView>();
		p=new Paint();
	}


	public CoreView clone(){
		CoreView v=null;

		try {
			v=(CoreView)super.clone();
			v.model=model.clone();
		} catch (CloneNotSupportedException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}

		return v;


	}


	/**
	 * タッチ判定
	 * @param x
	 * @param y
	 * @return
	 */
	public boolean isTouch(float x,float y){

		//消したいならオーバーライドして処理の変更をする
		if(!model.isShowView()) return false;	//非表示の場合はボタンの判定は行わない(衝突判定は行う)


		float centerX=model.getCenterX();
		float centerY=model.getCenterY();
		float width=model.getWidth();
		float height=model.getHeight();

		float tx=centerX-width*0.5f;
		float ty=centerY-height*0.5f;
		float bx=centerX+width*0.5f;
		float by=centerY+height*0.5f;

		if(x>=tx&& x<=bx){

			if(y>=ty && y<=by){
				return true;
			}
		}

		return false;

	}





	/**
	 * 衝突判定
	 * @param c
	 */
	public boolean checkCollision(CoreView cview){

		CoreModel c=cview.getModel();
		float tx=model.getCenterX()-model.getWidth()*0.5f;
		float ty=model.getCenterY()-model.getHeight()*0.5f;
		float bx=model.getCenterX()+model.getWidth()*0.5f;
		float by=model.getCenterY()+model.getHeight()*0.5f;

		float tx2=c.getCenterX()-c.getWidth()*0.5f;
		float ty2=c.getCenterY()-c.getHeight()*0.5f;
		float bx2=c.getCenterX()+c.getWidth()*0.5f;
		float by2=c.getCenterY()+c.getHeight()*0.5f;



		if((tx<=tx2 && bx>=tx2)){
			if((ty<=ty2 &&  by>=ty2) || (ty<=by2 &&  by>=by2 )){
				return true;
			}
		}else if((tx<=bx2 && bx>=bx2)){
			if((ty<=ty2 &&  by>=ty2) || (ty<=by2 &&  by>=by2 )){
				return true;
			}
		}

		return false;

	}

	/**
	 * 衝突したビューの登録
	 * @param view
	 */
	public void hitOtherView(CoreView view){
		if(this.hitViews.indexOf(view)==-1){
			this.hitViews.add(view);
		}
	}

	/**
	 * 衝突チェック
	 * @param view
	 * @return
	 */
	public boolean isHitView(CoreView view){

		if(this.hitViews.indexOf(view)==-1){
			return false;
		}

		return true;
	}

	/**
	 * 登録削除
	 * @param view
	 */
	public void outOtherView(CoreView view){
		this.hitViews.remove(view);
	}







	/**
	 * 描画処理
	 * @param canvas
	 * @param pool
	 * @param widthRate
	 * @param heightRate
	 */
	public void draw(Canvas canvas,float widthRate,float heightRate){

		if(!model.isShowView()) return;

		model.drawUpdate();

		Bitmap bmp=RiverCrossingAI.getImagePool().getBitmap(model.getImageData());



		float x=model.getCenterX()*widthRate;
		float y=model.getCenterY()*heightRate;
		float w=model.getWidth()*widthRate;
		float h=model.getHeight()*heightRate;
		float r=model.getRotation();


		int tx=(int)((x-w*0.5f));
		int ty=(int)((y-h*0.5f));
		int bx=(int)((x+w*0.5f));
		int by=(int)((y+h*0.5f));

		Rect src=new Rect(0,0,bmp.getWidth(),bmp.getHeight());
		Rect dst=new Rect(tx,ty,bx,by);

		if(p==null) p=new Paint();		//クローン用


		if(model.isChangeAlpha()){	//毎回これをやると重そう

			if(model.getAlpha()==255){	//不透明に戻った場合はもとの処理に戻す
				model.setChangeAlpha(false);
			}

			p.setAlpha(model.getAlpha());	//アルファーの変更

			canvas.save();
			if(r!=0){
				canvas.rotate(r,(bx-tx)*0.5f+tx,(by-ty)*0.5f+ty);
				canvas.drawBitmap(bmp, src, dst, p);
			}else{
				canvas.drawBitmap(bmp, src, dst, p);
			}
			canvas.restore();

		}else{

			canvas.save();
			if(r!=0){
				canvas.rotate(r,(bx-tx)*0.5f+tx,(by-ty)*0.5f+ty);
				canvas.drawBitmap(bmp, src, dst, null);
			}else{
				canvas.drawBitmap(bmp, src, dst, null);
			}
			canvas.restore();

		}


	}


	public CoreModel getModel() {
		return model;
	}


	public void setModel(CoreModel model) {
		this.model = model;
	}

	public int getPriority() {
		return priority;
	}


	public void setPriority(int priority) {
		this.priority = priority;
	}




}
