package A2;

public class RectangleImpl implements Rectangle,Polygon {


		private Point points[] = new Point[2];
		private Point side1;
		private Point side2;

		
	

		RectangleImpl(Point side1, Point side2){
			points[0]=side1;
			points[1]=side2;
			this.side1=side1;
			this.side2=side2;
			
		}
				
		public Point[] getPoints() {
			// TODO Auto-generated method stub
			return points;
		}


		
		public int getNumSides() {
			// TODO Auto-generated method stub
			return 4;
		}

		
		public Point getVertexAverage() {
			// TODO Auto-generated method stub
			double sumOfX =0;
			double sumOfY= 0;
			for (Point p: this.getPoints()){
				sumOfX+=p.getX();
				sumOfY+=p.getY();
			}
			double xCoord = (double) sumOfX/getPoints().length;
			double yCoord = (double) sumOfY/getPoints().length;
			Point vertexAverage= new Point(xCoord,yCoord);
			return vertexAverage;
			
		}

		
		public RectangleImpl getBoundingBox() {
			// TODO Auto-generated method stub
			return new RectangleImpl(side1,side2);
			
		}

		@Override
		public Point getCentroid() {
			// TODO Auto-generated method stub
			return getVertexAverage();
		}

		@Override
		public double getArea() {
			// TODO Auto-generated method stub
			return Math.abs((side1.getX()-side2.getX())*(side2.getY()-side1.getY()));
		
		}

		
		
		@Override
		
		public void move(double dx, double dy) {
			// TODO Auto-generated method stub
		
			for(int i=0;i<points.length;i++){
				points[i]=points[i].translate(dx, dy);
			}
			
			
		}

		@Override
		public void move(Point c) {
			// TODO Auto-generated method stub
		move(c.getX()-getCentroid().getX(),c.getY()-getCentroid().getY());
		}

		@Override
		public void scale(double factor) {
			// TODO Auto-generated method stub
			
			
			
			double currentX = getCentroid().getX();
			double currentY = getCentroid().getY();
			move(new Point(0,0));
			
		
			for(int i=0;i<points.length;i++){
				points[i] = new Point(points[i].getX()*factor,points[i].getY()*factor);
			}
			move(new Point(currentX,currentY));
			
		}

	
	

	public Point getLowerLeft(){
		return new Point(Math.min(side1.getX(),side2.getX()), Math.min(side2.getY(),side1.getY()));
	}
	public Point getLowerRight(){
		return new Point(Math.max(side1.getX(),side2.getX()), Math.min(side2.getY(),side1.getY()));
	}
	public Point getUpperRight(){
		return new Point(Math.max(side1.getX(),side2.getX()), Math.max(side2.getY(),side1.getY()));
	}
	public Point getUpperLeft(){
		return new Point(Math.min(side1.getX(),side2.getX()), Math.max(side2.getY(),side1.getY()));
	}
	
	public boolean isSquare() {
		// TODO Auto-generated method stub
	
	return Math.abs(side2.getX()-side1.getX())==Math.abs(side1.getY()-side2.getY());
	}

	
	
}
