package CookieCutter.g1;

import java.awt.geom.*;
import java.util.*;
import CookieCutter.*;

public final class CookieGroup extends Cookie {
	private static final Vertex[] kZeroVertices = new Vertex[0];
	private List mSubCookies;

	public CookieGroup(List iSubCookies) {
		mSubCookies = iSubCookies;

		int vertsPerCookie = ((Cookie) iSubCookies.get(0)).getNumVertices();
		int numCookies = iSubCookies.size();
		int num = vertsPerCookie * numCookies;

		mX = new double[num];
		mY = new double[num];
		double cX = 0;
		double cY = 0;
		for (int i = 0, n = numCookies; i < n; i++) {
			Cookie c = (Cookie) iSubCookies.get(i);
			Vertex centroid = c.mCentroid;
			cX += centroid.xpos();
			cY += centroid.ypos();

			for (int j = 0; j < vertsPerCookie; j++) {
				mX[i * vertsPerCookie + j] = c.mX[j];
				mY[i * vertsPerCookie + j] = c.mY[j];
			}
		}

		mCentroid = new Vertex(cX / numCookies, cY / numCookies);
		mArea = ((Cookie) iSubCookies.get(0)).getArea() * numCookies;
	}

	/**
	 * Returns the largest X value of any point in this polygon.  This value is
	 * used to determine the right boundary of a particular configuration of
	 * cookies.
	 */
	public double getLargestX() {
		return getBounds().getRight();
	}

	/**
	 * Returns a deep copy of this polygon.
	 */
	public Cookie copy() {
		List clones = new ArrayList(mSubCookies.size());

		for (int i = 0, n = mSubCookies.size(); i < n; i++) {
			clones.add(((Cookie) mSubCookies.get(i)).copy());
		}

		return new CookieGroup(clones);
	}

	public boolean intersects(Cookie iC) {
		for (int i = 0, n = mSubCookies.size(); i < n; i++) {
		
			if (iC.intersects((Cookie) mSubCookies.get(i))) {
				return true;
			}


//			if (((Cookie) mSubCookies.get(i)).intersects(iC)) {
//				return true;
//			}
		}

		return false;
	}

	public Cookie transform(Vertex iCentroid, double iRotationAngle) {
		int numCookies = mSubCookies.size();
		int vertsPerCookie = ((Cookie) mSubCookies.get(0)).getNumVertices();
		double dx = iCentroid.xpos() - mCentroid.xpos();
		double dy = iCentroid.ypos() - mCentroid.ypos();

		CookieGroup result = (CookieGroup) super.transform(iCentroid, iRotationAngle);		

		for (int i = 0, n = numCookies; i < n; i++) {
			Cookie c = (Cookie) mSubCookies.get(i);
			Vertex center = c.getCentroid();
			Vertex newCenter = new Vertex(center.xpos()+dx, center.ypos()+dy);
			
			result.mSubCookies.set(i, c.transform(
				rotate(newCenter, iCentroid, iRotationAngle), iRotationAngle));
		}

		return result;
	}

	private Vertex rotate(Vertex v, Vertex pivot, double iRotationAngle) {
		double dx, dy, newDX, newDY;
		
		double sin = Math.sin(iRotationAngle);
		double cos = Math.cos(iRotationAngle);
		
		dx = v.xpos() - pivot.xpos();
		dy = v.ypos() - pivot.ypos();
		newDX = dx * cos - dy * sin;
		newDY = dx * sin + dy * cos;
		
		v.setXpos(pivot.xpos()+newDX);
		v.setYpos(pivot.ypos()+newDY);
		
		return v;
	}
/*
	public Box getBounds() {
		if (mBounds == null) {
			double left = Double.MAX_VALUE;
			double right = Double.MIN_VALUE;
			double top = Double.MIN_VALUE;
			double bottom = Double.MAX_VALUE;

			for (int i = 0, n = mSubCookies.size(); i < n; i++) {
				Box box = ((Cookie) mSubCookies.get(i)).getBounds();
				double l = box.getLeft();
				double t = box.getTop();
				double r = box.getRight();
				double b = box.getBottom();
				
				if (l < left) {
					left = l;
				}
				if (t > top) {
					top = t;
				}
				if (r > right) {
					right = r;
				}
				
				if (b < bottom) {
					bottom = b;
				}
			}

			mBounds = new Box(left, top, right, bottom);
		}

		return mBounds;
	}
*/	
	
	public List getSubCookies() {
		return mSubCookies;
	}

}
