package com.example.andenginesample;

import java.io.IOException;

import org.andengine.audio.music.Music;
import org.andengine.audio.music.MusicFactory;
import org.andengine.engine.camera.Camera;
import org.andengine.engine.handler.timer.ITimerCallback;
import org.andengine.engine.handler.timer.TimerHandler;
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.Background;
import org.andengine.entity.sprite.Sprite;
import org.andengine.input.touch.TouchEvent;
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;
import org.andengine.util.debug.Debug;

public class ShowSixCardMusic extends SimpleBaseGameActivity {
	// 카메라 필드를 생성합니다.
	// 가로와 세로 2개의 카메라 변수를 선언했습니다.
	private Camera camera;
	Scene scene;

	private static final int CAMERA_WIDTH = 480;
	private static final int CAMERA_HEIGHT = 800;

	// 과일마다 자신의 판을 가지게 합니다.
	private BitmapTextureAtlas mBgTexture;
	private BitmapTextureAtlas mBgTextureBanana;
	private BitmapTextureAtlas mBgTextureGrape;

	// ---------------------------------------------
	// 사과카드, 같은 과일끼리는 같은 판을 사용한다.
	// ---------------------------------------------
	private ITextureRegion mImgObj; // 뒷면1
	private ITextureRegion mImgObjBehind; // 사과1
	private ITextureRegion mImgObj2; // 뒷면2
	private ITextureRegion mImgObjBehind2; // 사과2

	// ---------------------------------------------
	// 바나나 카드, 같은 과일끼리는 같은 판을 사용한다.
	// ---------------------------------------------
	private ITextureRegion mImgObjBanana; // 뒷면1
	private ITextureRegion mImgObjBehindBanana; // 바나나1
	private ITextureRegion mImgObjBanana2; // 뒷면2
	private ITextureRegion mImgObjBehindBanana2; // 바나나2

	// ---------------------------------------------
	// 포도 카드, 같은 과일끼리는 같은 판을 사용한다.
	// ---------------------------------------------
	private ITextureRegion mImgObjGrape; // 뒷면1
	private ITextureRegion mImgObjBehindGrape; // 포도1
	private ITextureRegion mImgObjGrape2; // 뒷면2
	private ITextureRegion mImgObjBehindGrape2; // 포도2

	Sprite appleSprite;
	Sprite backSprite;
	Sprite appleSprite2;
	Sprite backSprite2;

	Sprite bananaSprite;
	Sprite backSpriteBanana; // 바나나 뒷면
	Sprite bananaSprite2;
	Sprite backSpriteBanana2; // 바나나 뒷면2

	Sprite grapeSprite;
	Sprite backSpriteGrape; // 포도 뒷면
	Sprite grapeSprite2;
	Sprite backSpriteGrape2; // 포도 뒷면2

	// 카드를 연속으로 뒤집기 위해 bool값 선언
	// 카드는 6장. 뒤집히지 않으면 false
	boolean bOneFlip = false;
	boolean bTwoFlip = false;
	boolean bThreeFlip = false;
	boolean bFourFlip = false;
	boolean bFiveFlip = false;
	boolean bSixFlip = false;

	// 기존 카드와 현재 카드를 설정합니다.
	String beforeCard = null;
	String nowCard = null;

	// 카드를 고정하기 위한 6개의 상태값을 설정합니다.
	// Fix가 true이면 움직이지 않도록 합니다.
	boolean bOneFix = false;
	boolean bTwoFix = false;
	boolean bThreeFix = false;
	boolean bFourFix = false;
	boolean bFiveFix = false;
	boolean bSixFix = false;

	// 열려있는 카드 수를 세기 위한 count 플래그
	int openCnt = 0;

	// 순간적으로 여러 카드가 열리는 것을 막기 위한 플래그
	boolean bClosing = false;
	
	private Music mMusic;

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

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

		// ------------------------------------------------------------------
		// 사과카드
		// ------------------------------------------------------------------
		// 사과 과일의 판 선언
		// 한 판에서 위치는 서로 겹치지 않도록 한다.
		// 판을 하나만 사용하기 위해서 이미지를 판 위에 얹을 때 좌표를 다르게 놓음
		this.mBgTexture = new BitmapTextureAtlas(this.getTextureManager(),
				CAMERA_WIDTH, CAMERA_HEIGHT);
		// 뒷면 카드1
		this.mImgObj = BitmapTextureAtlasTextureRegionFactory.createFromAsset(
				this.mBgTexture, this, "back.png", 0, 0);

		// 사과 카드1
		this.mImgObjBehind = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBgTexture, this, "apple.png", 165, 0);

		// 뒷면 카드 2
		this.mImgObj2 = BitmapTextureAtlasTextureRegionFactory.createFromAsset(
				this.mBgTexture, this, "back.png", 0, 230);

		// 사과 카드2
		this.mImgObjBehind2 = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBgTexture, this, "apple.png", 165, 230);

		this.mBgTexture.load();

		// ------------------------------------------------------------------
		// 바나나 카드
		// ------------------------------------------------------------------
		this.mBgTextureBanana = new BitmapTextureAtlas(
				this.getTextureManager(), CAMERA_WIDTH, CAMERA_HEIGHT);
		// 뒷면 카드1
		this.mImgObjBanana = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBgTextureBanana, this, "back.png", 0, 0);

		// 바나나 카드1
		this.mImgObjBehindBanana = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBgTextureBanana, this, "banana.png",
						165, 0);

		// 뒷면 카드 2
		this.mImgObjBanana2 = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBgTextureBanana, this, "back.png", 0,
						230);

		// 바나나 카드2
		this.mImgObjBehindBanana2 = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBgTextureBanana, this, "banana.png",
						165, 230);

		this.mBgTextureBanana.load();

		// ------------------------------------------------------------------
		// 포도 카드
		// ------------------------------------------------------------------
		this.mBgTextureGrape = new BitmapTextureAtlas(this.getTextureManager(),
				CAMERA_WIDTH, CAMERA_HEIGHT);
		// 뒷면 카드1
		this.mImgObjGrape = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBgTextureGrape, this, "back.png", 0, 0);

		// 포도 카드1
		this.mImgObjBehindGrape = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBgTextureGrape, this, "grape.png", 165,
						0);

		// 뒷면 카드 2
		this.mImgObjGrape2 = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBgTextureGrape, this, "back.png", 0, 230);

		// 포도 카드2
		this.mImgObjBehindGrape2 = BitmapTextureAtlasTextureRegionFactory
				.createFromAsset(this.mBgTextureGrape, this, "grape.png", 165,
						230);

		this.mBgTextureGrape.load();

		MusicFactory.setAssetBasePath("mfx/");
		try {
			this.mMusic = MusicFactory.createMusicFromAsset(
					this.mEngine.getMusicManager(), this, "fingerrunner_main.ogg");
			this.mMusic.setLooping(true);
		} catch (final IOException e) {
			Debug.e(e);
		}

	}

	public void closeAll() {
		scene.registerUpdateHandler(new TimerHandler(0.2f,
				new ITimerCallback() {
					@Override
					public void onTimePassed(final TimerHandler pTimerHandler) {

						if (bOneFlip == true && bOneFix == false) {
							scene.detachChild(appleSprite);
							scene.attachChild(backSprite);
							bOneFlip = false;
						}

						if (bTwoFlip == true && bTwoFix == false) {
							scene.detachChild(appleSprite2);
							scene.attachChild(backSprite2);
							bTwoFlip = false;
						}

						if (bThreeFlip == true && bThreeFix == false) {
							scene.detachChild(bananaSprite);
							scene.attachChild(backSpriteBanana);
							bThreeFlip = false;
						}

						if (bSixFlip == true && bSixFix == false) {
							scene.detachChild(bananaSprite2);
							scene.attachChild(backSpriteBanana2);
							bSixFlip = false;
						}

						if (bFiveFlip == true && bFiveFix == false) {
							scene.detachChild(grapeSprite);
							scene.attachChild(backSpriteGrape);
							bFiveFlip = false;
						}

						if (bFourFlip == true && bFourFix == false) {
							scene.detachChild(grapeSprite2);
							scene.attachChild(backSpriteGrape2);
							bFourFlip = false;
						}

						openCnt = 0;

						scene.unregisterUpdateHandler(pTimerHandler);
					}

				}));
	}

	@Override
	protected Scene onCreateScene() {
		scene = new Scene();
		scene.setBackground(new Background(0f, 0f, 0f));
		final VertexBufferObjectManager vertexBufferObjectManager = this
				.getVertexBufferObjectManager();

		// -----------------------------------------------------------
		// 1번째 사과카드 세트
		// -----------------------------------------------------------
		appleSprite = new Sprite(10, 130, this.mImgObjBehind,
				vertexBufferObjectManager);

		backSprite = new Sprite(10, 130, this.mImgObj,
				vertexBufferObjectManager) {
			@Override
			public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
					final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
				if (pSceneTouchEvent.isActionDown() && bOneFix == false) {

					// 뒷면인경우, 뒷면상태에 터치하면 뒷면 카드를 없애고 사과카드를 노출한다.
					if (bOneFlip == false && (openCnt == 0 || openCnt == 1)) {
						scene.detachChild(backSprite);
						scene.attachChild(appleSprite);
						bOneFlip = true; // boolean 상태를 뒤집힌 상태로 변경

						openCnt = openCnt + 1;
					}

					nowCard = "apple";
					if (openCnt == 2) {
						// 이전 카드와 비교한다.
						if (nowCard.equals(beforeCard)) {
							bOneFix = true; // 카드 고정
							bTwoFix = true; // 카드 고정
						}
						// 2장이 다 펼쳐졌으면 모양이 다를 때 닫는다.
						else {
							closeAll();
						}

					}
					// 비교 후 이전 카드에 현재 카드를 대입해 둔다.
					beforeCard = "apple";

					return true;
				}

				return false;
			}
		};
		scene.attachChild(backSprite);
		scene.registerTouchArea(backSprite);

		// -----------------------------------------------------------
		// 2번째 사과카드 세트
		// -----------------------------------------------------------
		appleSprite2 = new Sprite(10, 450, this.mImgObjBehind2,
				vertexBufferObjectManager);

		backSprite2 = new Sprite(10, 450, this.mImgObj2,
				vertexBufferObjectManager) {
			@Override
			public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
					final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
				if (pSceneTouchEvent.isActionDown() && bTwoFix == false) {

					// 뒷면인경우, 뒷면상태에 터치하면 뒷면 카드를 없애고 사과카드를 노출한다.
					if (bTwoFlip == false && (openCnt == 0 || openCnt == 1)) {
						scene.detachChild(backSprite2);
						scene.attachChild(appleSprite2);
						bTwoFlip = true; // boolean 상태를 뒤집힌 상태로 변경

						openCnt = openCnt + 1;
					}

					nowCard = "apple";
					if (openCnt == 2) {
						// 이전 카드와 비교한다.
						if (nowCard.equals(beforeCard)) {
							bTwoFix = true; // 카드 고정
							bOneFix = true; // 같은 쌍도 고정
						} // 2장이 다 펼쳐졌으면 모양이 다를 때 닫는다.
						else {
							closeAll();
						}
						// openCnt = 0;
					}
					// 비교 후 이전 카드에 현재 카드를 대입해 둔다.
					beforeCard = "apple";
					return true;
				}

				return false;
			}
		};
		scene.attachChild(backSprite2);
		scene.registerTouchArea(backSprite2);

		// -----------------------------------------------------------
		// 1번째 바나나카드 세트
		// -----------------------------------------------------------
		bananaSprite = new Sprite(165, 130, this.mImgObjBehindBanana,
				vertexBufferObjectManager);

		backSpriteBanana = new Sprite(165, 130, this.mImgObjBanana,
				vertexBufferObjectManager) {
			@Override
			public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
					final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
				if (pSceneTouchEvent.isActionDown() && bThreeFix == false) {

					// 뒷면인경우, 뒷면상태에 터치하면 뒷면 카드를 없애고 사과카드를 노출한다.
					if (bThreeFlip == false && (openCnt == 0 || openCnt == 1)) {
						scene.detachChild(backSpriteBanana);
						scene.attachChild(bananaSprite);
						bThreeFlip = true; // boolean 상태를 뒤집힌 상태로 변경

						openCnt = openCnt + 1;
					}

					nowCard = "banana";
					if (openCnt == 2) {
						// 이전 카드와 비교한다.
						if (nowCard.equals(beforeCard)) {
							bThreeFix = true; // 카드 고정
							bSixFix = true; // 카드 고정
						} // 2장이 다 펼쳐졌으면 모양이 다를 때 닫는다.
						else {
							closeAll();
						}
						// openCnt = 0;
					}
					// 비교 후 이전 카드에 현재 카드를 대입해 둔다.
					beforeCard = "banana";
					return true;
				}

				return false;
			}
		};
		scene.attachChild(backSpriteBanana);
		scene.registerTouchArea(backSpriteBanana);

		// -----------------------------------------------------------
		// 2번째 바다나카드 세트
		// -----------------------------------------------------------
		bananaSprite2 = new Sprite(320, 450, this.mImgObjBehindBanana2,
				vertexBufferObjectManager);

		backSpriteBanana2 = new Sprite(320, 450, this.mImgObjBanana2,
				vertexBufferObjectManager) {
			@Override
			public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
					final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
				if (pSceneTouchEvent.isActionDown() && bSixFix == false) {

					// 뒷면인경우, 뒷면상태에 터치하면 뒷면 카드를 없애고 사과카드를 노출한다.
					if (bSixFlip == false && (openCnt == 0 || openCnt == 1)) {
						scene.detachChild(backSpriteBanana2);
						scene.attachChild(bananaSprite2);
						bSixFlip = true; // boolean 상태를 뒤집힌 상태로 변경

						openCnt = openCnt + 1;
					}

					nowCard = "banana";
					if (openCnt == 2) {
						// 이전 카드와 비교한다.
						if (nowCard.equals(beforeCard)) {
							bSixFix = true; // 카드 고정
							bThreeFix = true; // 카드 고정
						} // 2장이 다 펼쳐졌으면 모양이 다를 때 닫는다.
						else {
							closeAll();
						}
					}
					// 비교 후 이전 카드에 현재 카드를 대입해 둔다.
					beforeCard = "banana";
					return true;
				}

				return false;
			}
		};
		scene.attachChild(backSpriteBanana2);
		scene.registerTouchArea(backSpriteBanana2);

		// -----------------------------------------------------------
		// 1번째 포도 카드 세트
		// -----------------------------------------------------------
		grapeSprite = new Sprite(320, 130, this.mImgObjBehindGrape,
				vertexBufferObjectManager);

		backSpriteGrape = new Sprite(320, 130, this.mImgObjGrape,
				vertexBufferObjectManager) {
			@Override
			public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
					final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
				if (pSceneTouchEvent.isActionDown() && bFiveFix == false) {

					// 뒷면인경우, 뒷면상태에 터치하면 뒷면 카드를 없애고 사과카드를 노출한다.
					if (bFiveFlip == false && (openCnt == 0 || openCnt == 1)) {
						scene.detachChild(backSpriteGrape);
						scene.attachChild(grapeSprite);
						bFiveFlip = true; // boolean 상태를 뒤집힌 상태로 변경

						openCnt = openCnt + 1;
					}

					nowCard = "grape";
					if (openCnt == 2) {
						// 이전 카드와 비교한다.
						if (nowCard.equals(beforeCard)) {
							bFiveFix = true; // 카드 고정
							bFourFix = true; // 카드 고정
						} // 2장이 다 펼쳐졌으면 모양이 다를 때 닫는다.
						else {
							closeAll();
						}
					}
					// 비교 후 이전 카드에 현재 카드를 대입해 둔다.
					beforeCard = "grape";
					return true;
				}

				return false;
			}
		};
		scene.attachChild(backSpriteGrape);
		scene.registerTouchArea(backSpriteGrape);

		// -----------------------------------------------------------
		// 2번째 포도 카드 세트
		// -----------------------------------------------------------
		grapeSprite2 = new Sprite(165, 450, this.mImgObjBehindGrape2,
				vertexBufferObjectManager);

		backSpriteGrape2 = new Sprite(165, 450, this.mImgObjGrape2,
				vertexBufferObjectManager) {
			@Override
			public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
					final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
				if (pSceneTouchEvent.isActionDown() && bFourFix == false) {

					// 뒷면인경우, 뒷면상태에 터치하면 뒷면 카드를 없애고 사과카드를 노출한다.
					if (bFourFlip == false && (openCnt == 0 || openCnt == 1)) {
						scene.detachChild(backSpriteGrape2);
						scene.attachChild(grapeSprite2);
						bFourFlip = true; // boolean 상태를 뒤집힌 상태로 변경

						openCnt = openCnt + 1;
					}

					nowCard = "grape";
					if (openCnt == 2) {
						// 이전 카드와 비교한다.
						if (nowCard.equals(beforeCard)) {
							bFourFix = true; // 카드 고정
							bFiveFix = true; // 카드 고정
						} // 2장이 다 펼쳐졌으면 모양이 다를 때 닫는다.
						else {
							closeAll();

						}
					}
					// 비교 후 이전 카드에 현재 카드를 대입해 둔다.
					beforeCard = "grape";
					return true;
				}

				return false;
			}
		};
		scene.attachChild(backSpriteGrape2);
		scene.registerTouchArea(backSpriteGrape2);

//		if(ShowSixCardMusic.this.mMusic.isPlaying()) {
//			ShowSixCardMusic.this.mMusic.pause();
//		} else {
			ShowSixCardMusic.this.mMusic.play();
		//}
		
		return scene;

	}

}
