package icy.type.rectangle;

import icy.type.geom.Line2DUtil;
import icy.util.ShapeUtil;

import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;

public class Rectangle2DUtil
{
    /**
     * Returns the shortest line segment which result from the intersection of the given rectangle <b>bounds</b> and
     * line. It returns <code>null</code> if the line segment does not intersects the Rectangle <b>content</b>.
     */
    public static Line2D getIntersectionLine(Rectangle2D rectangle, Line2D line)
    {
        if (rectangle.intersectsLine(line))
        {
            final List<Point2D> result = new ArrayList<Point2D>();

            final Point2D topLeft = new Point2D.Double(rectangle.getMinX(), rectangle.getMinY());
            final Point2D topRight = new Point2D.Double(rectangle.getMaxX(), rectangle.getMinY());
            final Point2D bottomRight = new Point2D.Double(rectangle.getMaxX(), rectangle.getMaxY());
            final Point2D bottomLeft = new Point2D.Double(rectangle.getMinX(), rectangle.getMaxY());
            Point2D intersection;

            intersection = Line2DUtil.getIntersection(new Line2D.Double(topLeft, topRight), line, true, false);
            if (intersection != null)
                result.add(intersection);
            intersection = Line2DUtil.getIntersection(new Line2D.Double(topRight, bottomRight), line, true, false);
            if (intersection != null)
                result.add(intersection);
            intersection = Line2DUtil.getIntersection(new Line2D.Double(bottomRight, bottomLeft), line, true, false);
            if (intersection != null)
                result.add(intersection);
            intersection = Line2DUtil.getIntersection(new Line2D.Double(bottomLeft, topLeft), line, true, false);
            if (intersection != null)
                result.add(intersection);

            if (result.size() >= 2)
                return new Line2D.Double(result.get(0), result.get(1));
        }

        return null;
    }

    /**
     * Returns a scaled form of the specified {@link Rectangle2D} by specified factor.
     * 
     * @param rect
     *        the {@link Rectangle2D} to scale
     * @param factor
     *        the scale factor
     * @param centered
     *        if true then scaling is centered (rect location is modified)
     */
    public static Rectangle2D getScaledRectangle(Rectangle2D rect, double factor, boolean centered)
    {
        final Rectangle2D result = new Rectangle2D.Double();

        result.setFrame(rect);
        ShapeUtil.scale(result, factor, centered);

        return result;
    }
}