package airdata.map;

import static org.geotools.filter.ConstantExpression.BLACK;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.geotools.data.DataUtilities;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.factory.GeoTools;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.map.DefaultMapContext;
import org.geotools.map.DefaultMapLayer;
import org.geotools.map.MapContext;
import org.geotools.map.MapLayer;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.renderer.GTRenderer;
import org.geotools.renderer.lite.StreamingRenderer;
import org.geotools.styling.AnchorPoint;
import org.geotools.styling.Displacement;
import org.geotools.styling.Font;
import org.geotools.styling.LabelPlacement;
import org.geotools.styling.SLD;
import org.geotools.styling.Style;
import org.geotools.styling.StyleFactory;
import org.geotools.styling.TextSymbolizer;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.filter.FilterFactory;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Point;

public class TextPositioningTest {
	
	public static void main(String[] args) throws IOException {
		MapLayer layer = new DefaultMapLayer(createPointFeature(), createPointStyle());
		MapContext map = new DefaultMapContext(new MapLayer[] {layer}, DefaultGeographicCRS.WGS84);
		map.setAreaOfInterest(new ReferencedEnvelope(-10, 10, -10, 10, DefaultGeographicCRS.WGS84));
		
		GTRenderer draw = new StreamingRenderer();
		draw.setContext(map);
		
		Rectangle paintArea = new Rectangle(60, 60);
		
		BufferedImage bi = new BufferedImage(paintArea.width, paintArea.height, BufferedImage.TYPE_INT_ARGB);
		Graphics2D graphics = bi.createGraphics();
		graphics.setColor(Color.WHITE);
		graphics.fillRect(0, 0, bi.getWidth(), bi.getHeight());
		draw.paint(graphics, paintArea, map.getAreaOfInterest());
		graphics.dispose();
		
		ImageIO.write(bi, "png", new File("", "output.png"));
	}
	
	private static FeatureCollection<SimpleFeatureType, SimpleFeature> createPointFeature() {
		SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder();
		typeBuilder.setName("pointlabel");
		typeBuilder.add("point", Point.class, DefaultGeographicCRS.WGS84);
		typeBuilder.add("label", String.class);
		SimpleFeatureType featureType = typeBuilder.buildFeatureType();
		
		double longitude = 0.0;
		double latitude = 0.0;
		Point point = JTSFactoryFinder.getGeometryFactory(null)
				.createPoint( new Coordinate(longitude, latitude) );
		
		SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(featureType);
		featureBuilder.add(point);
		featureBuilder.add("O");
		SimpleFeature feature = featureBuilder.buildFeature(null);
		
		return DataUtilities.collection(feature);
	}
	
	private static Style createPointStyle() {
		StyleFactory  sf = CommonFactoryFinder.getStyleFactory(GeoTools.getDefaultHints());
		FilterFactory ff = CommonFactoryFinder.getFilterFactory(GeoTools.getDefaultHints());
		
		Font font = sf.getDefaultFont();
		font.setSize(ff.literal(40.0));
		
		Displacement disp  = sf.createDisplacement(ff.literal(0), ff.literal(0));
		AnchorPoint anchor = sf.createAnchorPoint(ff.literal(0.5), ff.literal(0.5));
		LabelPlacement placement = sf.createPointPlacement(anchor, disp, ff.literal(0));

		TextSymbolizer sym = sf.createTextSymbolizer(
				sf.createFill(BLACK), new Font[]{font},
				null, ff.property("label"), placement, null);
		
		return SLD.wrapSymbolizers(sym);
	}
	
}
