package com.fingerHurdle.www;

import org.andengine.engine.camera.Camera;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.AutoParallaxBackground;
import org.andengine.entity.scene.background.ParallaxBackground.ParallaxEntity;
import org.andengine.entity.sprite.Sprite;
import org.andengine.input.touch.TouchEvent;
import org.andengine.opengl.texture.TextureOptions;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.vbo.VertexBufferObjectManager;
import org.andengine.ui.activity.SimpleBaseGameActivity;

public class CharacterButton extends SimpleBaseGameActivity {
	// 카메라 필드를 생성합니다. 가로와 세로 2개의 카메라 변수를 선언했습니다.
	private Camera camera;
	private static final int CAMERA_WIDTH = 800;
	private static final int CAMERA_HEIGHT = 480;

	// ===================================================
	// Fields
	// ===================================================

	// 이미지를 새로 선언할때 이 Atlas도 재정의 필요함
	// 즉, 이미지 한장당 하나의 BitmapTextureAtlas 필요
	private BitmapTextureAtlas mAutoParallaxBackgroundTexture;
	private ITextureRegion mParallaxLayerBack;
	private ITextureRegion mParallaxLayerTop;
	private ITextureRegion mParallaxLayerBottom;

	// ----------------------------------------------------
	// 달리기를 위한 버튼 선언
	// ----------------------------------------------------
	private BitmapTextureAtlas mBitmapTextureAtlas;
	private BitmapTextureAtlas mBitmapTextureAtlasBlue;

	private ITextureRegion mFaceTextureRegion;
	private ITextureRegion mFaceTextureRegionBlue;
	private ITextureRegion mFaceTextureRegion2;

	Sprite face;
	Sprite face2;

	// ----------------------------------------------------
	// 달리기 캐릭터 선언
	// ----------------------------------------------------

	private BitmapTextureAtlas mRunnerTextureAtlas;
	private BitmapTextureAtlas mRunnerTextureAtlas2;

	private ITextureRegion mRunnerTextureRegion1;
	private ITextureRegion mRunnerTextureRegion2;

	Scene scene;

	// 달리기 버튼을 컨트롤 하기 위한 boolean 값
	boolean bLeft = false;
	boolean bRight = false;

	// 달리기 캐릭터 컨트롤을 하기 위한 boolean 값
	boolean bLeftD = false;
	boolean bRightD = false;

	@Override
	public EngineOptions onCreateEngineOptions() {
		camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
		EngineOptions engineOptions = new EngineOptions(true,
				ScreenOrientation.LANDSCAPE_FIXED, new FillResolutionPolicy(),
				camera);
		return engineOptions;
	}

	@Override
	protected void onCreateResources() {
		BitmapTextureAtlasTextureRegionFactory.setAssetBasePath("gfx/");

		// 전체 판을 1280*800 으로 넓게 선언
		this.mAutoParallaxBackgroundTexture = new BitmapTextureAtlas(
				this.getTextureManager(), 1280, 800);

		// 상단의 구름
		this.mParallaxLayerTop = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mAutoParallaxBackgroundTexture, this,
						"cloud.png", 0, 0);

		// 하단의 식물
		this.mParallaxLayerBottom = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mAutoParallaxBackgroundTexture, this,
						"plant.png", 0, 600);

		// 480 * 800 경주 안압지
		this.mParallaxLayerBack = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mAutoParallaxBackgroundTexture, this,
						"bg_an.jpg", 0, 150);

		this.mAutoParallaxBackgroundTexture.load();

		// ----------------------------------------------------
		// 달리기 버튼 이미지 선언부
		// ----------------------------------------------------
		this.mBitmapTextureAtlas = new BitmapTextureAtlas(
				this.getTextureManager(), 100, 100, TextureOptions.BILINEAR);

		this.mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBitmapTextureAtlas, this, "red_tr.gif",
						0, 0);

		this.mBitmapTextureAtlas.load();

		// ------------------------------------------
		// 달리기 버튼 파란색 이미지 선언부
		// ------------------------------------------
		this.mBitmapTextureAtlasBlue = new BitmapTextureAtlas(
				this.getTextureManager(), 100, 100, TextureOptions.BILINEAR);

		this.mFaceTextureRegionBlue = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBitmapTextureAtlasBlue, this,
						"blue_tr.gif", 0, 0);

		this.mBitmapTextureAtlasBlue.load();

		// ------------------------------------------
		// 달리기 사람1
		// ------------------------------------------
		this.mRunnerTextureAtlas = new BitmapTextureAtlas(
				this.getTextureManager(), 100, 100, TextureOptions.BILINEAR);
		this.mRunnerTextureAtlas2 = new BitmapTextureAtlas(
				this.getTextureManager(), 100, 100, TextureOptions.BILINEAR);

		this.mRunnerTextureRegion1 = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mRunnerTextureAtlas, this, "man1_tr.gif",
						0, 0);
		this.mRunnerTextureAtlas.load();
		// ------------------------------------------
		// 달리기 사람2
		// ------------------------------------------
		this.mRunnerTextureRegion2 = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mRunnerTextureAtlas2, this,
						"man2_tr.gif", 0, 0);
		this.mRunnerTextureAtlas2.load();
	}

	@Override
	protected Scene onCreateScene() {
		scene = new Scene();

		final AutoParallaxBackground autoParallaxBackground = new AutoParallaxBackground(
				0, 0, 0, 5);
		final VertexBufferObjectManager vertexBufferObjectManager = this
				.getVertexBufferObjectManager();

		// ParallaxEntity의 첫번째 값은 객체가 흘러가는 방향을 의미한다.
		// +는 왼쪽에서 오른쪽으로 흘러간다.

		// 안압지 배경
		autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(+2.0f,
				new Sprite(0, 0, this.mParallaxLayerBack,
						vertexBufferObjectManager)));

		// 상단 구름
		autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(+5.0f,
				new Sprite(0, 80, this.mParallaxLayerTop,
						vertexBufferObjectManager)));

		// 하단 식물
		autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(+10.0f,
				new Sprite(0, CAMERA_HEIGHT
						- this.mParallaxLayerBottom.getHeight(),
						this.mParallaxLayerBottom, vertexBufferObjectManager)));

		scene.setBackground(autoParallaxBackground);

		// ------------------------------------------
		// 캐릭터 스프라이트 출력
		// ------------------------------------------
		final float middleY = CAMERA_HEIGHT - mRunnerTextureRegion1.getHeight();
		final float middleX = CAMERA_WIDTH / 2
				- mRunnerTextureRegion1.getWidth() / 2;

		final Sprite runner1 = new Sprite(middleX, middleY,
				this.mRunnerTextureRegion1, this.getVertexBufferObjectManager());
		runner1.setScale(1); // 이미지의 배율 설정. 4면 4배확대
		scene.attachChild(runner1);

		final Sprite runner2 = new Sprite(middleX, middleY,
				this.mRunnerTextureRegion2, this.getVertexBufferObjectManager());
		runner2.setScale(1); // 이미지의 배율 설정

		// ------------------------------------------
		// 달리기 버튼1의 출력
		// ------------------------------------------
		final float centerX = CAMERA_WIDTH - this.mFaceTextureRegion.getWidth()
				* 2 - 80;

		final float centerY = CAMERA_HEIGHT
				- this.mFaceTextureRegion.getHeight() - 10;

		final Sprite face1_2 = new Sprite(centerX, centerY,
				this.mFaceTextureRegionBlue,
				this.getVertexBufferObjectManager());
		scene.attachChild(face1_2);

		final float centerX2 = CAMERA_WIDTH
				- this.mFaceTextureRegion.getWidth() - 10;

		final float centerY2 = CAMERA_HEIGHT
				- this.mFaceTextureRegion.getHeight() - 10;

		final Sprite face2_2 = new Sprite(centerX2, centerY2,
				this.mFaceTextureRegionBlue,
				this.getVertexBufferObjectManager());

		face = new Sprite(centerX, centerY, this.mFaceTextureRegion,
				this.getVertexBufferObjectManager()) {
			@Override
			public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
					final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
				switch (pSceneTouchEvent.getAction()) {
				case TouchEvent.ACTION_UP:
					if (bRight == false ) {
						bLeft = true;
						bRight = true;

						scene.attachChild(runner2);
						scene.detachChild(runner1);

						// 터치된 자신의 위치의 빨간 버튼을 없애고 
						// 상대쪽 버튼의 파란 버튼을 없앤다.(상대방쪽을 빨간 버튼으로 만들기 위해서)
						scene.detachChild(face);
						scene.detachChild(face2_2);
						bLeftD = true;

						if (bRightD == true) {
							// 자신쪽 버튼을 파란색으로 변경
							// 상대방쪽을 빨간색으로 변경
							scene.attachChild(face1_2);
							scene.attachChild(face2);
							bRightD = false;
						}

						break;
					}

				}

				return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX,
						pTouchAreaLocalY);
			}
		};
		face.setScale(1); // 이미지의 배율 설정
		scene.attachChild(face);
		//  터치 객체로 인식
		scene.registerTouchArea(face);

		// ------------------------------------------
		// 달리기 버튼2의 출력
		// ------------------------------------------

		face2 = new Sprite(centerX2, centerY2, this.mFaceTextureRegion,
				this.getVertexBufferObjectManager()) {
			@Override
			public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
					final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
				switch (pSceneTouchEvent.getAction()) {
				case TouchEvent.ACTION_UP:

					if (bRight == true) {
						bLeft = false;
						bRight = false;

						// 캐릭터 교체
						scene.attachChild(runner1);
						scene.detachChild(runner2);

						// 터치된 자신의 위치의 빨간 버튼을 없애고 
						// 상대쪽 버튼의 파란 버튼을 없앤다.(상대방쪽을 빨간 버튼으로 만들기 위해서)
						scene.detachChild(face2);
						scene.detachChild(face1_2);
						bRightD = true;

						if (bLeftD == true) {
							// 자신쪽 버튼을 파란색으로 변경
							// 상대방쪽을 빨간색으로 변경
							scene.attachChild(face2_2);
							scene.attachChild(face);
							bLeftD = false;
						}

						break;
					}
				}
				return super.onAreaTouched(pSceneTouchEvent, pTouchAreaLocalX,
						pTouchAreaLocalY);
			}
		};
		face2.setScale(1); // 이미지의 배율 설정. 4면 4배확대
		scene.attachChild(face2);
		// 터치 객체로 인식
		scene.registerTouchArea(face2);
		scene.setTouchAreaBindingOnActionDownEnabled(true);

		return scene;
	}
}
