package usda.weru.gis.gui;

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

import org.geotools.styling.FeatureTypeStyle;

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

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;

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

        Graphic gr = styleFactory.createDefaultGraphic();

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

        //ExternalGraphic pngMark = styleFactory.createExternalGraphic(GISGUIUtil.class.getResource("map-marker.png"), "png");
        gr.graphicalSymbols().clear();

        gr.graphicalSymbols().add(crossMark);

        gr.setSize(filterFactory.literal(20));

        /*
         * Setting the geometryPropertyName arg to null signals that we want to
         * draw the default geomettry of features
         */
        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;
    }

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

        Graphic gr = styleFactory.createDefaultGraphic();

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

        gr.graphicalSymbols().clear();

        gr.graphicalSymbols().add(circleMark);

        gr.setSize(filterFactory.literal(size));

        /*
         * Setting the geometryPropertyName arg to null signals that we want to
         * draw the default geomettry of features
         */
        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;
    }
}
