/**
 * Very simple Model class for Buttons tutorial.
 */

import uchicago.src.sim.engine.SimpleModel;
import uchicago.src.sim.engine.SimInit;
import uchicago.src.sim.gui.DisplaySurface;
import uchicago.src.sim.gui.Object2DDisplay;
import uchicago.src.sim.space.Object2DTorus;
import uchicago.src.sim.analysis.OpenSequenceGraph;
import uchicago.src.sim.analysis.Sequence;
import java.awt.*;

public class TutModel extends SimpleModel {
  private DisplaySurface dsurf;
  private int spaceSize = 50;
  private int buttons = 500;
  private int clusterSz;
  private OpenSequenceGraph plot;

  public TutModel () {
    params = new String[] { "Buttons", "SpaceSize"};
  }

  // Overrides of SimpleModel
  public void setup() {
    super.setup();
    clusterSz = 1;

    if (dsurf != null) dsurf.dispose();
    dsurf = new DisplaySurface(this, "Buttons Display");
    super.registerDisplaySurface("Buttons Display", dsurf);

    if (plot != null) plot.dispose();
    plot = new OpenSequenceGraph("Buttons", this);
    plot.setAxisTitles("time", "cluster");
    plot.addSequence("MaxCluster", new Sequence() {
      public double getSValue() { return clusterSz; }
    });
  }

  public void buildModel() {
    Object2DTorus space = new Object2DTorus(spaceSize, spaceSize);
    for (int i = 0; i<buttons; i++) {
      int x = getNextIntFromTo(0, spaceSize - 1);
      int y = getNextIntFromTo(0, spaceSize - 1);
      Color color =  new Color(
        getNextIntFromTo(0,255),
        getNextIntFromTo(0,255),
        getNextIntFromTo(0,255)
      );

      TutAgent btn = new TutAgent(space, i);
      btn.setXY(x,y);
      btn.setColor(color);
      agentList.add(btn);
    }

    Object2DDisplay display = new Object2DDisplay(space);
    dsurf.addDisplayable(display, "Buttons Space");

    plot.setXRange(0, buttons*2);
    plot.setYRange(0, buttons);

    plot.display();
    dsurf.display();
  }

  public void step(){
    TutAgent a1=(TutAgent)agentList.get(getNextIntFromTo(0,buttons-1));
    TutAgent a2=(TutAgent)agentList.get(getNextIntFromTo(0,buttons-1));
    int g1=a1.getGroup();
    int g2=a2.getGroup();
    int thisClusterSz = 0;
    for (int i = 0; i < agentList.size(); i++) {
      TutAgent a = (TutAgent)agentList.get(i);
      if (a.getGroup() == g1) {
        a.setGroup(g2);
        a.setColor(a2.getColor());
      }
      if (a.getGroup() == g2)
        thisClusterSz++;
    }
    clusterSz = Math.max(clusterSz,thisClusterSz);

    plot.step();
    dsurf.updateDisplay();
    if (clusterSz == buttons)
        getController().pauseSim();
  }

  //Getters/Setters
  public int getButtons() { return buttons; }
  public void setButtons(int buttons) { this.buttons = buttons; }

  public int getSpaceSize() { return spaceSize; }
  public void setSpaceSize(int spaceSize) { this.spaceSize = spaceSize; }

  public static void main(String[] args) {
    SimInit init = new SimInit();
    init.loadModel(new TutModel(), null, false);
  }
}

