/*-
 *  Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
 * 
 *  This file is part of CityDoctor2.
 *
 *  CityDoctor2 is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  CityDoctor2 is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with CityDoctor2.  If not, see <https://www.gnu.org/licenses/>.
 */
package de.hft.stuttgart.citydoctor2.edge;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.List;

import org.junit.Test;

import de.hft.stuttgart.citydoctor2.datastructure.ConcretePolygon;
import de.hft.stuttgart.citydoctor2.datastructure.Geometry;
import de.hft.stuttgart.citydoctor2.datastructure.GeometryType;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing;
import de.hft.stuttgart.citydoctor2.datastructure.LinearRing.LinearRingType;
import de.hft.stuttgart.citydoctor2.datastructure.Lod;
import de.hft.stuttgart.citydoctor2.datastructure.Vertex;

public class IntersectionErrorsTest {

	@Test
	public void testWrongIntersection() {
		Geometry geom = new Geometry(GeometryType.SOLID, Lod.LOD1);

		ConcretePolygon p1 = new ConcretePolygon();

		LinearRing ext1 = new LinearRing(LinearRingType.EXTERIOR);
		p1.setExteriorRing(ext1);
		
		/*
		Vertex [x=3515051.7, y=5405988.05, z=246.67]
				Vertex [x=3515047.52, y=5405985.1, z=246.67]
				Vertex [x=3515049.03, y=5405978.98, z=246.67]
				Vertex [x=3515054.29, y=5405983.65, z=246.67]
				Vertex [x=3515051.7, y=5405988.05, z=246.67]
				*/
		

		Vertex v1 = new Vertex(3515047.52, 5405985.1, 246.67);
		Vertex v2 = new Vertex(3515049.03, 5405978.98, 246.67);
		Vertex v3 = new Vertex(3515054.29, 5405983.65, 246.67);
		Vertex v4 = new Vertex(3515051.7, 5405988.05, 246.67);

		ext1.addVertex(v1);
		ext1.addVertex(v2);
		ext1.addVertex(v3);
		ext1.addVertex(v4);
		ext1.addVertex(v1);

		ConcretePolygon p2 = new ConcretePolygon();
		LinearRing ext2 = new LinearRing(LinearRingType.EXTERIOR);
		p2.setExteriorRing(ext2);

		/*
		 		Vertex [x=3515049.03, y=5405978.98, z=237.903218]
				Vertex [x=3515054.29, y=5405983.65, z=237.903218]
				Vertex [x=3515054.29, y=5405983.65, z=246.67]
				Vertex [x=3515049.03, y=5405978.98, z=246.67]
				Vertex [x=3515049.03, y=5405978.98, z=237.903218] 
		 */
		
		Vertex v5 = new Vertex(3515049.03, 5405978.98, 237.903218);
		Vertex v6 = new Vertex(3515054.29, 5405983.65, 237.903218);
		Vertex v7 = v3;
		Vertex v8 = v2;

		ext2.addVertex(v5);
		ext2.addVertex(v6);
		ext2.addVertex(v7);
		ext2.addVertex(v8);
		ext2.addVertex(v5);

		geom.addPolygon(p1);
		geom.addPolygon(p2);

		geom.prepareForChecking();
		
		
		System.out.println();
		for (Vertex v : p1.getExteriorRing().getVertices()) {
			System.out.println(v);
		}
		System.out.println();
		for (Vertex v : p2.getExteriorRing().getVertices()) {
			System.out.println(v);
		}
		
		MeshSurface meshSurface = MeshSurface.of(geom);
		List<CDPolygonNs> polygons = meshSurface.getPolygons();
		assertEquals(2, polygons.size());
		
		CDPolygonNs edgePoly1 = meshSurface.getPolygons().get(0);
		CDPolygonNs edgePoly2 = meshSurface.getPolygons().get(1);
		
		
		List<PolygonPolygonIntersection> intersectPolygons = IntersectPlanarPolygons.intersectPolygons(edgePoly1, edgePoly2, 0.000001, 0.001);
		assertTrue(intersectPolygons.isEmpty());
	}
}
