// 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.plugins.algorithmanimator.core.atoms;

//import static graphtea.library.event.GraphEvent.nameType.NEW_GRAPH;

import graphtea.graph.atributeset.GraphAttrSet;
import graphtea.graph.graph.Edge;
import graphtea.graph.graph.GPoint;
import graphtea.graph.graph.GraphModel;
import graphtea.graph.graph.Vertex;
import graphtea.library.BaseEdge;
import graphtea.library.BaseVertex;
import graphtea.library.event.Event;
import graphtea.library.event.GraphEvent;
import graphtea.library.event.typedef.BaseGraphEvent;
import graphtea.platform.core.BlackBoard;
import graphtea.plugins.algorithmanimator.core.AtomAnimator;

import java.util.HashMap;

import static graphtea.library.event.GraphEvent.EventType.NEW_GRAPH;

/**
 * @author Azin Azadi
 */
public class NewGraph implements AtomAnimator<BaseGraphEvent> {
    public boolean isAnimatable(Event event) {
        if (event instanceof GraphEvent) {
            return ((GraphEvent) event).eventType == NEW_GRAPH;
        }
        return false;
    }

    public BaseGraphEvent animate(BaseGraphEvent event, BlackBoard b) {
        BlackBoard bb = graphtea.plugins.main.core.actions.graph.NewGraph.doJob(b);
//        System.out.println("blackboard:"+bb);
        Object o = bb.getData(GraphAttrSet.name);
        //*********************** \/ \/ \/ \/ \/ \/ \/ 
//        System.out.println(o.getClass().getName());              //print mikone esme classe graph ro
//        System.out.println("instance:" +(o instanceof Graph));   //print mikone: false
        GraphModel g = ((GraphModel) o);
        //hich vaght 2 chap nemishe, iani too khate bala moshkeli hast
//        System.out.println("2");
        HashMap<BaseVertex, Vertex> map = new HashMap<>();
        for (BaseVertex v : event.graph) {
            Vertex vv = new Vertex();
            map.put(v, vv);
            //vv.setModel((Vertex) v);
            g.insertVertex(vv);
            vv.setLocation(new GPoint(Math.random() * 200, Math.random() * 200));
        }
        for (BaseEdge e : event.graph.edges()) {
            Vertex src = map.get(e.source);
            Vertex dest = map.get(e.target);
            Edge ee = new Edge(src, dest);
            g.insertEdge(ee);
        }
        return event;
    }
}
