// License: GPL. For details, see Readme.txt file.
package org.openstreetmap.gui.jmapviewer;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Stroke;

import javax.swing.UIManager;

public abstract class MapObjectImpl {
    private Layer layer;
    private String name;
    private Style style;
    private Boolean visible;

    public MapObjectImpl(String name) {
        this(null, name, null);
    }

    public MapObjectImpl(Layer layer) {
        this(layer, null, null);
    }

    public MapObjectImpl(Layer layer, String name, Style style) {
        super();
        this.layer = layer;
        this.name = name;
        this.style = style;
    }

    public Layer getLayer() {
        return layer;
    }

    public void setLayer(Layer layer) {
        this.layer = layer;
    }

    public Style getStyle() {
        return style;
    }

    public Style getStyleAssigned() {
        return style == null ? (layer == null ? null : layer.getStyle()) : style;
    }

    public void setStyle(Style style) {
        this.style = style;
    }

    public Color getColor() {
        Style styleAssigned = getStyleAssigned();
        return styleAssigned == null ? null : getStyleAssigned().getColor();
    }

    public void setColor(Color color) {
        if (style == null && color != null) style = new Style();
        if (style != null) style.setColor(color);
    }

    public Color getBackColor() {
        Style styleAssigned = getStyleAssigned();
        return styleAssigned == null ? null : getStyleAssigned().getBackColor();
    }

    public void setBackColor(Color backColor) {
        if (style == null && backColor != null) style = new Style();
        if (style != null) style.setBackColor(backColor);
    }

    public Stroke getStroke() {
        Style styleAssigned = getStyleAssigned();
        return styleAssigned == null ? null : getStyleAssigned().getStroke();
    }

    public void setStroke(Stroke stroke) {
        if (style == null && stroke != null) style = new Style();
        if (style != null) style.setStroke(stroke);
    }

    public Font getFont() {
        Style styleAssigned = getStyleAssigned();
        return styleAssigned == null ? null : getStyleAssigned().getFont();
    }

    public void setFont(Font font) {
        if (style == null && font != null) style = new Style();
        if (style != null) style.setFont(font);
    }

    private boolean isVisibleLayer() {
        return layer == null || layer.isVisible() == null || layer.isVisible();
    }

    public boolean isVisible() {
        return visible == null ? isVisibleLayer() : visible;
    }

    public void setVisible(Boolean visible) {
        this.visible = visible;
    }

    public String getName() {
        return name;
    }

    public void setName(String txt) {
        this.name = txt;
    }

    public static Font getDefaultFont() {
        Font f = UIManager.getDefaults().getFont("TextField.font");
        if (f == null) {
            f = Font.decode(null);
        }
        return new Font(f.getName(), Font.BOLD, f.getSize());
    }

    public void paintText(Graphics g, Point position) {
        if (name != null && g != null && position != null) {
            if (getFont() == null) {
                Font f = getDefaultFont();
                setFont(new Font(f.getName(), Font.BOLD, f.getSize()));
            }
            g.setColor(Color.DARK_GRAY);
            g.setFont(getFont());
            g.drawString(name, position.x+MapMarkerDot.DOT_RADIUS+2, position.y+MapMarkerDot.DOT_RADIUS);
        }
    }
}
