// GraphTea Project: http://github.com/graphtheorysoftware/GraphTea
// Copyright (C) 2012 Graph Theory Software Foundation: http://GraphTheorySoftware.com
// Copyright (C) 2008 Mathematical Science Department of Sharif University of Technology
// Distributed under the terms of the GNU General Public License (GPL): http://www.gnu.org/licenses/

package graphtea.graph.atributeset;

import graphtea.graph.graph.GraphModel;
import graphtea.platform.attribute.AttributeSet;
import graphtea.platform.attribute.NotifiableAttributeSetImpl;
import graphtea.platform.lang.ArrayX;

import java.awt.*;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * this class provides a way to have a Graph object as a NotifiableAttributeSet
 * this is useful whenever some one wants to work blindly with graph attributes
 * for example on saving graph to a gml xml file it is important to have all attributes
 * saved, the meaning of values of attributes is not important, or when a property editor
 * wants to show and edit the attributes of graph to the user, at that time it can use
 * a XAttribute to have better looks see GraphPropertyEditor class as an example.
 * <p/>
 * An other usage of this class is whenever some one wants to listen to changes of
 * a user defined or a rare attribute which normally has no listening capability,
 * for example when you want to change the program according to Graph ID whenever it
 * changes. ID attribute on graph has not a formal listening way, so this class is usefull
 * at that time.
 *
 * @author Hooman Mohajeri Moghaddam - added image file for background.
 * @author Azin Azadi
 * @see graphtea.ui.AttributeSetView
 * @see graphtea.ui.NotifiableAttributeSetView
 * @see graphtea.plugins.main.core.actions.GraphPropertyEditor
 */
public class GraphAttrSet implements AttributeSet {

    GraphModel g;
    NotifiableAttributeSetImpl atrs = new NotifiableAttributeSetImpl();

    public static final String EDGEDEFAULT = "edgedefault";
    public static final String EDGEDEFAULT_DIRECTED = "directed";
    public static final String EDGEDEFAULT_UNDIRECTED = "undirected";

    //    public static final String ID = "id";
    public static final String DIRECTED = "directed";
    public static final String LABEL = "label";
    public static final String ZOOM = "Zoom";
    public static final String FONT = "Font";
    public static final String DRAW_VERTEX_LABELS = "Vertex Labels";
    public static final String DRAW_EDGE_LABELS = "Edge Labels";
    public static final String IS_EDGES_CURVED = "Curved Edges";
    public static final String BACKGROUND_IMAGE = "Background";
    public static final String Allow_Loops = "Allow Loops";

    //****//
    //    public static final String CENTERX = "centerx";
    //    public static final String CENTERY = "centery";
    public static final String name = "Graph.GraphModel";

    public Map<String, Object> getAttrs() {
        Map<String, Object> ret = new HashMap<>();
        ret.put(DRAW_VERTEX_LABELS, g.isDrawVertexLabels());
        ret.put(DRAW_EDGE_LABELS, g.isDrawEdgeLabels());
        ret.put(IS_EDGES_CURVED, g.isEdgesCurved());
        ret.put(Allow_Loops, g.isAllowLoops());
        ret.put(DIRECTED, g.isDirected() ? EDGEDEFAULT_DIRECTED : EDGEDEFAULT_UNDIRECTED);
        ret.put(LABEL, g.getLabel());
        ret.put(ZOOM, g.getZoom());
        ret.put(FONT, g.getFont());
        ret.put(BACKGROUND_IMAGE, g.getBackgroundImageFile());
        if (g.getUserDefinedAttributes() != null)
            ret.putAll(g.getUserDefinedAttributes());
        return ret;
    }

    public void put(String atrName, Object val) {
        switch (atrName) {
            case LABEL:
                g.setLabel((String) val);
                break;
            case ZOOM:
                g.setZoom((ArrayX<String>) val);
                break;
            case FONT:
                g.setFont((Font) val);
                break;
            case DRAW_VERTEX_LABELS:
                g.setDrawVertexLabels((Boolean) val);
                break;
            case IS_EDGES_CURVED:
                g.setIsEdgesCurved((Boolean) val);
                break;
            case BACKGROUND_IMAGE:
                g.setBackgroundImageFile((File) val);
                break;
            case Allow_Loops:
                g.setAllowLoops((Boolean) val);
                break;
            case DRAW_EDGE_LABELS:
                g.setDrawEdgeLabels((Boolean) val);
                break;
            default:
                g.setUserDefinedAttribute(atrName, val);
                break;
        }

    }

    public Object get(String atrName) {
        Object ret = null;
        switch (atrName) {
            case LABEL:
                ret = g.getLabel();
                break;
            case DIRECTED:
                ret = g.isDirected();
                break;
            case ZOOM:
                ret = g.getZoom();
                break;
            case FONT:
                ret = g.getFont();
                break;
            case DRAW_VERTEX_LABELS:
                ret = g.isDrawVertexLabels();
                break;
            case IS_EDGES_CURVED:
                ret = g.isEdgesCurved();
                break;
            case BACKGROUND_IMAGE:
                ret = g.getBackgroundImageFile();
                break;
            case DRAW_EDGE_LABELS:
                ret = g.isDrawEdgeLabels();
                break;
            case Allow_Loops:
                ret = g.isAllowLoops();
                break;
            default:
                ret = g.getUserDefinedAttribute(atrName);
                break;
        }
        return ret;
    }

    public GraphAttrSet(GraphModel g) {
        this.g = g;
    }
}
