package usda.weru.gis.gui;

import java.awt.Color;
import org.geotools.factory.CommonFactoryFinder;

import org.geotools.styling.FeatureTypeStyle;
import org.geotools.styling.Fill;

import org.geotools.styling.Graphic;
import org.geotools.styling.Mark;
import org.geotools.styling.PointPlacement;
import org.geotools.styling.PointSymbolizer;
import org.geotools.styling.PolygonSymbolizer;
import org.geotools.styling.Rule;
import org.geotools.styling.Stroke;

import org.geotools.styling.Style;
import org.geotools.styling.StyleFactory;
import org.geotools.styling.TextSymbolizer;
import org.opengis.filter.FilterFactory;

/**
 *
 * @author Joseph Levin <joelevin@weru.ksu.edu>
 */
public class GISGUIUtil {

    private static final double SCALE_FACTOR = 100000d;

    public static Style createCrossPointStyle(Color fill, Color stroke) {
        StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(null);
        FilterFactory filterFactory = CommonFactoryFinder.getFilterFactory(null);

        Mark crossMark = styleFactory.getCrossMark();
        crossMark.setStroke(styleFactory.createStroke(filterFactory.literal(stroke), filterFactory.literal(1)));
        crossMark.setFill(styleFactory.createFill(filterFactory.literal(fill)));

        Graphic gr = styleFactory.createDefaultGraphic();
        gr.graphicalSymbols().clear();
        gr.graphicalSymbols().add(crossMark);
        gr.setSize(filterFactory.literal(20));

        PointSymbolizer sym = styleFactory.createPointSymbolizer(gr, null);

        Rule rule = styleFactory.createRule();
        rule.symbolizers().add(sym);
        
        FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle(new Rule[]{rule});
        Style style = styleFactory.createStyle();
        style.featureTypeStyles().add(fts);

        return style;
    }

    public static Style createCirclePointStyle(double size, Color fill, Color stroke) {
        StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(null);
        FilterFactory filterFactory = CommonFactoryFinder.getFilterFactory(null);

        Mark circleMark = styleFactory.getCircleMark();
        circleMark.setStroke(styleFactory.createStroke(filterFactory.literal(stroke), filterFactory.literal(1)));
        circleMark.setFill(styleFactory.createFill(filterFactory.literal(fill)));

        Graphic gr = styleFactory.createDefaultGraphic();
        gr.graphicalSymbols().clear();
        gr.graphicalSymbols().add(circleMark);
        gr.setSize(filterFactory.literal(size));

        PointSymbolizer pointSym = styleFactory.createPointSymbolizer(gr, null);

        TextSymbolizer textSym = styleFactory.createTextSymbolizer();
        textSym.setLabel(filterFactory.property("name"));
        PointPlacement textPlacement = styleFactory.getDefaultPointPlacement();
        textPlacement.setDisplacement(styleFactory.createDisplacement(filterFactory.literal(-size / 2), filterFactory.literal(-size - 10)));
        textSym.setLabelPlacement(textPlacement);

        Rule pointRule = styleFactory.createRule();
        pointRule.symbolizers().add(pointSym);
        pointRule.setMaxScaleDenominator(750d * SCALE_FACTOR);

        Rule textRule = styleFactory.createRule();
        textRule.symbolizers().add(textSym);
        textRule.setMaxScaleDenominator(675d * SCALE_FACTOR);

        FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle(new Rule[]{pointRule, textRule});
        Style style = styleFactory.createStyle();
        style.featureTypeStyles().add(fts);

        return style;
    }
    
    
    public static Style createShapeStyle(double size, Color colorFill, double opacity, Color colorStroke, double strokeWidth) {
        StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(null);
        FilterFactory filterFactory = CommonFactoryFinder.getFilterFactory(null);

        Stroke stroke = styleFactory.createStroke(filterFactory.literal(colorStroke), filterFactory.literal(strokeWidth));
        Fill fill = styleFactory.createFill(filterFactory.literal(colorFill), filterFactory.literal(opacity));

        PolygonSymbolizer polySym = styleFactory.createPolygonSymbolizer(stroke, fill, null);

        Graphic gr = styleFactory.createDefaultGraphic();
        Mark circleMark = styleFactory.getCircleMark();
        circleMark.setStroke(stroke);
        circleMark.setFill(fill);
        gr.graphicalSymbols().clear();
        gr.graphicalSymbols().add(circleMark);
        gr.setSize(filterFactory.literal(size));
        PointSymbolizer pointSym = styleFactory.createPointSymbolizer(gr, null);

        TextSymbolizer textSym = styleFactory.createTextSymbolizer();
        textSym.setLabel(filterFactory.property("name"));
        PointPlacement textPlacement = styleFactory.getDefaultPointPlacement();
//        textPlacement.setDisplacement(styleFactory.createDisplacement(filterFactory.literal(-size / 2), filterFactory.literal(-size - 10)));
        textSym.setLabelPlacement(textPlacement);
        textSym.setFont(styleFactory.createFont(filterFactory.literal("Times"), 
                                                filterFactory.literal("plain"), 
                                                filterFactory.literal("normal"), 
                                                filterFactory.literal(15)));
        textSym.getOptions().put(TextSymbolizer.GOODNESS_OF_FIT_KEY, ".00001");


        Rule polyRule = styleFactory.createRule();
        polyRule.symbolizers().add(polySym);

        Rule textRule = styleFactory.createRule();
        textRule.symbolizers().add(textSym);

        Rule pointRule = styleFactory.createRule();
        pointRule.symbolizers().add(pointSym);

        FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle(new Rule[]{polyRule, pointRule, textRule});
        Style style = styleFactory.createStyle();
        style.featureTypeStyles().add(fts);

        return style;
    }
}
