package collision;

import java.awt.Graphics2D;
import java.awt.Graphics;
import java.awt.geom.Point2D;
import java.awt.Point;
import java.awt.geom.Rectangle2D;
import java.awt.geom.AffineTransform;
import main.MapObject;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Area;

public class Bound extends Area
{
    public Bound(final Shape s) {
        super(s);
    }
    
    public boolean intersects(final Rectangle o, final MapObject parent) {
        if (o == null) {
            return false;
        }
        Area a;
        if (parent == null) {
            a = this;
        }
        else {
            a = this.createTransformedArea(new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, parent.getBoundX(), parent.getBoundY()));
        }
        return a.intersects(o);
    }
    
    public boolean contains(final Rectangle o, final MapObject parent) {
        if (o == null) {
            return false;
        }
        Area a;
        if (parent == null) {
            a = this;
        }
        else {
            a = this.createTransformedArea(new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, parent.getBoundX(), parent.getBoundY()));
        }
        return a.contains(o);
    }
    
    public boolean intersects(final Bound o, final MapObject parent, final MapObject oParent) {
        if (o == null) {
            return false;
        }
        Area a1;
        if (parent == null) {
            a1 = this;
        }
        else {
            a1 = this.createTransformedArea(new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, parent.getBoundX(), parent.getBoundY()));
        }
        Area a2;
        if (oParent == null) {
            a2 = o;
        }
        else {
            a2 = o.createTransformedArea(new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, oParent.getBoundX(), oParent.getBoundY()));
        }
        final Area intersection = new Area(a1);
        intersection.intersect(a2);
        return !intersection.isEmpty();
    }
    
    public boolean contains(final Bound o, final MapObject parent, final MapObject oParent) {
        if (o == null) {
            return false;
        }
        Area a1;
        if (parent == null) {
            a1 = this;
        }
        else {
            a1 = this.createTransformedArea(new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, parent.getBoundX(), parent.getBoundY()));
        }
        Area a2;
        if (oParent == null) {
            a2 = o;
        }
        else {
            a2 = o.createTransformedArea(new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, oParent.getBoundX(), oParent.getBoundY()));
        }
        final Area combined = new Area(a1);
        combined.add(a2);
        return combined.equals(a1);
    }
    
    public boolean contains(final Point p, final MapObject parent) {
        Area a;
        if (parent == null) {
            a = this;
        }
        else {
            a = this.createTransformedArea(new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, parent.getBoundX(), parent.getBoundY()));
        }
        return a.contains(p);
    }
    
    public void draw(final Graphics g, final int x, final int y, final MapObject parent) {
        final Area a1 = this.createTransformedArea(new AffineTransform(1.0f, 0.0f, 0.0f, 1.0f, x + parent.getBoundX(), y + parent.getBoundY()));
        ((Graphics2D)g).draw(a1);
    }
}
