public class Field {
	private SpiderSolitia st;
	private int tokuten;
	private int kaisu;
	private int time;
	private CardRow [] cr;
	private AddCardSet acs;
	private Card [] card;
	private int [] check = new int[104];
	private CompleteSet cs;
	private FieldCard [] fc;
	private int [][] zahyou;
	private int fc_cnt;
	public Field(SpiderSolitia st){
		this.st = st;
		cr = new CardRow[10];
		for(int i = 0;i < 10;i++){
			cr[i] = new CardRow();
		}
		acs = new AddCardSet();
		cs = new CompleteSet();
		tokuten = 500;
		kaisu = 0;
		time = 0;
		fc = new FieldCard[13];
		zahyou = new int[13][2];
		makeCard();
		deliveryCard();
	}
	public void setTokuten(int ten){
		tokuten = tokuten + ten;
	}
	public int getTokuten(){
		return tokuten;
	}
	public void addKaisu(){
		kaisu = kaisu + 1;
	}
	public int getKaisu(){
		return kaisu;
	}
	public void addTime(){
		time = time + 1;
	}
	public int getTime(){
		return time;
	}
	public CardRow getCardRow(int i){
		return cr[i];
	}
	public AddCardSet getAcs(){
		return acs;
	}
	public CompleteSet getCs(){
		return cs;
	}
	public void makeCard(){
		card = new Card[104];
		for(int i = 0;i < 104;i++){
			int su = i / 8 + 1;
			card[i] = new Card(su,1,1);
			check[i] = 0;
		}
	}
	public void deliveryCard(){
		for(int i = 0;i < 10;i++){
			int su = 6;
			if(i > 3){
				su = 5;
			}
			for(int j = 0;j < su;j++){
				int index = (int)(Math.random() * 104);
				while(check[index] != 0){
					index = (int)(Math.random() * 104);
				}
				boolean front = false;
				if(j == su - 1){
					front = true;
				}
				cr[i].addCard(new FieldCard(card[index],15+i*55,50+j*12,front));
			}
		}
		for(int i = 0;i < 5;i++){
			for(int j = 0;j < 10;j++){
				int index = (int)(Math.random() * 104);
				while(check[index] != 0){
					index = (int)(Math.random() * 104);
				}
				acs.getAddCardRow(i).setCard(j,new FieldCard(card[index],510,475+5*i,false));
			}
		}
	}
	public int getAddlastcardsu() {
		int count = 0;
		for(int i = 0;i < 5;i++){
			if(!acs.getAddCardRow(i).getEnd()){
				count++;
			}
		}
		return count;
	}
	public boolean isComplete(){
		if(cs.getCompleteCount() == 8){
			return true;
		}
		return false;
	}
	/**
	 * @return
	 */
	public void movePrepare(int ix,int iy){
		fc_cnt = 0;
		int x = getRow(ix,iy);
		if(x != 99){
			int size = cr[x].getSize(); 
			int y = (iy - 50) / 12;
			if(y >= size - 1){
				if(iy < 120+12*(size - 1)){
					y = size - 1;
				}else{
					y = size;
				}
			}
			if(y < size){
				if(cr[x].getCard(y).getFrontstate()){
					int baseNumber = cr[x].getCard(y).getCard().getNumber();
					boolean isMove = true;
					int yy = y + 1;
					for(int i = yy;i < size;i++){
						int number = cr[x].getCard(i).getCard().getNumber();
						if(baseNumber == number + 1){
							baseNumber = number;
						}else{
							isMove = false;
						}
					}
					if(isMove){
						st.setPush(true);
						for(int i = y;i < size;i++){
							fc[fc_cnt] = cr[x].getCard(i);
							zahyou[fc_cnt][0] = x;
							zahyou[fc_cnt][1] = i;
							fc_cnt++;
						}
						st.setMouse_x(ix);
						st.setMouse_y(iy);
					}
				}
			}
		}
	}
	private int getRow(int ix,int iy){
		for(int i = 0;i < 10;i++){
			if(ix >= st.getXX(i) && ix < st.getXX(i) + 50){
				return i;
			}
		}
		return 99;
	}
	public boolean movemain(int ix,int iy){
		boolean isAble = false;
		int x = getRow(ix,iy);
		if(x != 99){
			int maisu = cr[x].getSize();
			if(fc[0].getIndex_y() >= (50 +(maisu - 1) * 12) && fc[0].getIndex_y() < (120 +(maisu - 1) * 12)){
				int bnumber = -1;
				if(maisu > 0){
					bnumber = cr[x].getCard(maisu - 1).getCard().getNumber();
				}
				int number = fc[0].getCard().getNumber();
				if(maisu == 0 || bnumber == number + 1){
					isAble = true;
					for(int i = 0;i < fc_cnt;i++){
						maisu = cr[x].getSize();
						fc[i].setIndex_x(st.getXX(x));
						fc[i].setIndex_y(50 + maisu * 12);
						cr[x].addCard(fc[i]);
						cr[zahyou[i][0]].removeCard();
					}
					frontCheck(cr[zahyou[0][0]]);
					setTokuten(-1);
					addKaisu();
					if(completeCheck(cr[x])){
						FieldCard [] fcard = movecardSet(x);
						st.completeThreadStart(x,fcard);
						cs.addCompleteCount();
						setTokuten(100);
						return true;
					}
			    }else{
					setReverse();
				}
			}else{
				setReverse();
			}
		}else{
			setReverse();
		}
		st.setPush(false);
		return isAble;
	}
	public void setReverse(){
		for(int i = 0;i < fc_cnt;i++){
			cr[zahyou[0][0]].removeCard();
		}
		for(int i = 0;i < fc_cnt;i++){
			int maisu = cr[zahyou[0][0]].getSize();
			fc[i].setIndex_x(st.getXX(zahyou[0][0]));
			fc[i].setIndex_y(50 + maisu * 12);
			cr[zahyou[0][0]].addCard(fc[i]);
		}
	}
	public FieldCard [] movecardSet(int x){
		int maisu = cr[x].getSize();
		FieldCard [] fcard = new FieldCard[13];
		for(int i = 0;i < 13;i++){
			fcard[i] = cr[x].getCard(maisu - (i + 1));
		}
		return fcard;
	}
	public void moveIndex(int ix,int iy,int mouse_x,int mouse_y){
		for(int i = 0;i < fc_cnt;i++){
			int idx = fc[i].getIndex_x();
			int idy = fc[i].getIndex_y();
			fc[i].setIndex_x(idx+ix-mouse_x);
			fc[i].setIndex_y(idy+iy-mouse_y);
		}
		st.setMouse_x(ix);
		st.setMouse_y(iy);
	}
	public void addCardSet(int ix,int iy) {
		for(int i = 0;i < 10;i++){
			if(cr[i].getSize() == 0){
				return;
			}
		}
		int add_su = getAddlastcardsu();
		if(add_su >0 && ix >= 510 && ix < 560 && iy >= 475 + 5 * add_su && iy < 545 + 5 * add_su){
			FieldCard [] fc = acs.getAddCardRow(add_su - 1).getCard();
			st.addThreadStart(fc);
			acs.getAddCardRow(add_su - 1).setEnd(true); 
		}
	}
	public FieldCard[] getMoveFieldCard() {
		return fc;
	}
	public int getMoveFieldCardLength(){
		return fc_cnt;
	}
	public boolean completeCheck(CardRow cr){
		boolean flg = false;
		for(int i = 0;i < cr.getSize();i++){
			if(cr.getCard(i).getFrontstate()){
				if(cr.getCard(i).getCard().getNumber() == 13){
					if(completesubCheck(cr,i)){
						return true;
					}
				}
			}
		}
		return false;
	}
	public boolean completesubCheck(CardRow cr,int i){
		int base_number = 12;
		for(int j = i + 1;j < cr.getSize();j++){
			if(base_number == cr.getCard(j).getCard().getNumber()){
				base_number--;
				if(base_number == 0){
					return true;
				}
			}else{
				return false;
			}
		}
		return false;
	}
	public void frontCheck(CardRow cr){
		int size = cr.getSize();
		if(size > 0){
			if(!cr.getCard(size-1).getFrontstate()){
				cr.getCard(size-1).setFrontstate(true);
			}
		}
	}
}
