package CookieCutter.g1;

import java.util.*;
import CookieCutter.*;

/**
 * @author Mark Ayzenshtat
 */
public class ValueCorrectionPlacer implements CookiePlacer {
	public void placeCookies(Cookie[] iCookies) {
		Cookie best = null;
		double bestScore;		
		
		initPosition(iCookies);
		
		Random rng = new Random();		
		List placed = new ArrayList();
		Cookie c = null;
		for (int i = 0; i < iCookies.length; i++) {
			bestScore = Double.MAX_VALUE;
			best = iCookies[i];
			
			for (int j = 0; j < 1000; j++) {
				if (j == 0) {
					c = iCookies[i];
				} else {							
					c = iCookies[i].transform(iCookies[i].getCentroid(), rng.nextDouble() * Math.PI * 2);
				}
				
				c = c.flushToTopObstacle(placed).pack(rng.nextBoolean(), placed);
				
				double score = c.getLargestX(); 
				if (score < bestScore && c.isInBound()) {
					bestScore = score;					
					best = c;
				}
			}
			
			placed.add(best);
		}
		
		Cookie[] bestArrangement = (Cookie[]) placed.toArray(new Cookie[0]);		
		System.arraycopy(bestArrangement, 0, iCookies, 0, bestArrangement.length);
	}
		
	private Cookie[] copy(Cookie[] iCookies) {
		Cookie[] c = new Cookie[iCookies.length];
		System.arraycopy(iCookies, 0, c, 0, c.length);
		return c;
	}
	
	private void initPosition(Cookie[] iCookies) {
		new SafeCookiePlacer().placeCookies(iCookies);
		
		for (int i = 0; i < iCookies.length; i++) {
			iCookies[i] = iCookies[i].shift((iCookies[i].getBounds().getWidth() + i) * 3, 0);	
		}
		
	}
}
