package library.core.screen;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import library.core.listener.OnCoreCollisionListener;
import library.core.listener.OnCoreTouchDownListener;
import library.core.listener.OnCoreTouchUpListener;
import library.core.mainAI.CoreActivity.ScreenLoadEndRecieve;
import library.core.view.CoreTextView;
import library.core.view.CoreView;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CoreScreen extends SurfaceView implements SurfaceHolder.Callback{


	private ArrayList<CoreView> views;
	private ArrayList<CoreView> colViews;
	private ArrayList<CoreView> touchUpViews;
	private ArrayList<CoreView> touchDownViews;
	private ArrayList<CoreTextView> textViews;

	private int screenWidthBase=720;
	private int screenHeightBase=1280;

	private boolean isInitEnd=false;	//初期化終了の判定　これがtrueでないと画面サイズなどが取得できない

	private ScreenLoadEndRecieve loadEndRecieve;

	public CoreScreen(Context context, AttributeSet attrs) {
		super(context,attrs);

		getHolder().addCallback(this);

		views=new ArrayList<CoreView>();
		colViews=new ArrayList<CoreView>();
		touchUpViews=new ArrayList<CoreView>();
		touchDownViews=new ArrayList<CoreView>();
		textViews=new ArrayList<CoreTextView>();
	}

	public void setLoadEndRecieve(ScreenLoadEndRecieve recieve){
		this.loadEndRecieve=recieve;
	}



	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO 自動生成されたメソッド・スタブ

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {

	}

	@Override
	public void surfaceChanged(SurfaceHolder h, int format, int width,
			int height) {

		isInitEnd=true;
		loadEndRecieve.sendLoadEnd();
	}



	/**
	 * 描画
	 * @param pool
	 */
	public void  draw(){


		SurfaceHolder holder=getHolder();

		if(!isInitEnd) return;
		if(!holder.getSurface().isValid()) return ;

		Canvas canvas=null;

		try{
			canvas=holder.lockCanvas();
			canvas.drawColor(Color.BLACK);

			for(CoreView v : views){
				v.draw(canvas, getWidth()/(float)screenWidthBase, getHeight()/(float)screenHeightBase);
			}

		//文字の表示
		for(int i=0;i<textViews.size();i++){
			textViews.get(i).draw(canvas);
		}

		}finally{
			holder.unlockCanvasAndPost(canvas);
		}

	}


	public void checkCollision(){

		for(int i=0;i<colViews.size();i++){
			CoreView c=colViews.get(i);



			for(int j=0;j<colViews.size();j++){
				CoreView c2=colViews.get(j);
				//ターゲット以外との当たり判定
				if(i!=j){
					if(c2.checkCollision(c)){
						//すでにCにあたっているか？
						if(!c2.isHitView(c)){
							c2.hitOtherView(c);
							((OnCoreCollisionListener)c2.getModel()).onCollisionEnter(c.getModel());
						}else{
							((OnCoreCollisionListener)c2.getModel()).onCollisionIn(c.getModel());
						}
					}else{
						//以前にあたっていたけど、今回はあたっていない場合は、登録を解除して、外にでたことを通知する
						if(c2.isHitView(c)){
							((OnCoreCollisionListener)c2.getModel()).onCollisionOut(c.getModel());
							c2.outOtherView(c);
						}
					}


				}
			}

		}

	}

	/**
	 * タッチダウン時のチェック
	 * @param x
	 * @param y
	 */
	public void checkTouchDown(float x,float y){
		x=castX(x);
		y=castY(y);


		for(int i=0;i<touchDownViews.size();i++){
			if(touchDownViews.get(i).isTouch(x, y)){
				((OnCoreTouchDownListener)touchDownViews.get(i).getModel()).onTouchDown();
			}
		}
	}

/**
 * タッチアップ時のチャック
 * @param x
 * @param y
 */
	public void checkTouchUp(float x,float y){

		x=castX(x);
		y=castY(y);


		for(int i=0;i<touchUpViews.size();i++){
			if(touchUpViews.get(i).isTouch(x, y)){
				((OnCoreTouchUpListener)touchUpViews.get(i).getModel()).onTouchUp();
			}
		}

	}


	/**
	 * ビューの追加
	 * @param view
	 */
	public void addView(CoreView view){
		this.views.add(view);

		//描画の優先度にしたがってソート
		Collections.sort(views,new Comparator<CoreView>() {
			@Override
			public int compare(CoreView lhs, CoreView rhs) {
				return  lhs.getPriority()<rhs.getPriority()?-1:1;
			}

		});


		if(view.getModel() instanceof OnCoreTouchUpListener){
			this.touchUpViews.add(view);
		}

		if(view.getModel() instanceof OnCoreTouchDownListener){
			this.touchDownViews.add(view);
		}

		if(view.getModel() instanceof OnCoreCollisionListener){
			this.colViews.add(view);
		}
	}

	/**
	 * 文字専用ビューの追加
	 * @param textView
	 */
	public void addTextView(CoreTextView textView){
		this.textViews.add(textView);
	}

	/**
	 * ビューの削除
	 * @param view
	 */
	public void deleteView(CoreView view){
		views.remove(view);

		if(view.getModel() instanceof OnCoreTouchUpListener){
			this.touchUpViews.remove(view);
		}

		if(view.getModel() instanceof OnCoreTouchDownListener){
			this.touchDownViews.remove(view);
		}

		if(view.getModel() instanceof OnCoreCollisionListener){
			this.colViews.remove(view);
		}
	}

	/**
	 * 文字専用ビューの削除
	 * @param view
	 */
	public void deleteTextView(CoreTextView view){
		textViews.remove(view);
	}

	/**
	 * 画像を優先順位別に並び替える　登録後に優先度を変更したときに使用
	 */
	public void sortView(){
		//描画の優先度にしたがってソート
		Collections.sort(views,new Comparator<CoreView>() {
			@Override
			public int compare(CoreView lhs, CoreView rhs) {
				return  lhs.getPriority()<rhs.getPriority()?-1:1;
			}

		});
	}

	/**
	 * ユーザーの想定した寸法にキャスト
	 * @param x
	 * @return
	 */
	public int castX(float x){
		return (int)(x*(this.screenWidthBase/(float)getWidth()));
	}

	/**
	 *  ユーザーの想定した寸法にキャスト
	 * @param y
	 * @return
	 */
	public int castY(float y){
		return (int)(y*(this.screenHeightBase/(float)getHeight()));
	}


	public boolean isInitEnd() {
		return isInitEnd;
	}


	/**
	 * ユーザーが指定するサイズ（スマホ本体の画面サイズとは別）
	 * @param w
	 * @param h
	 */
	public void setScreenSize(int w,int h){
		this.screenWidthBase=w;
		this.screenHeightBase=h;
	}


	/**
	 * スクリーンのリセット
	 */
	public void clearScreen(){
		views.clear();
		touchDownViews.clear();
		touchUpViews.clear();
		colViews.clear();
		textViews.clear();
	}




}
