/*
 * Licensed Materials - Property of Rogue Wave Software, Inc. 
 * © Copyright Rogue Wave Software, Inc. 2014, 2015 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */
package main;
import ilog.views.maps.defense.symbology.app6a.IlvApp6aSymbol;
import ilog.views.sdm.model.IlvDefaultSDMModel;
import ilog.views.sdm.model.IlvDefaultSDMNode;
import ilog.views.sdm.model.IlvSDMNode;
import java.util.Random;

/**
 * Specific SDM Model that simulates a battle field composed of hiearchical armies.
 */
public class BattleField extends IlvDefaultSDMModel {
  Random r = new Random(123);
  final static String affiliations[] = {
      IlvApp6aSymbol.AFFILIATION_FRIEND,
      IlvApp6aSymbol.AFFILIATION_HOSTILE,
      IlvApp6aSymbol.AFFILIATION_NEUTRAL,
      IlvApp6aSymbol.AFFILIATION_UNKNOWN
  };
  final static String mobilities[]= {
    "MO","MQ","MS","MY", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
  };
  final static String functions[] = {
     "UCFHS-","UCFHL-","UCFHM-","UCFHH-" //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
  };
  final static String units[] = {
    "EWAL-","EWDLS","EWDMS","EWDHS" //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
 };
  /**
   * Creates a new <code>BattleField</code> structure .
   */
  public BattleField() {
    buildModel();
  }
  
 /**
   * 
   */
  private void buildModel() {
    setAdjusting(true);
    for (int aff = 0; aff < affiliations.length; aff++) {
      double dxa = r.nextDouble()*10;
      double dya = r.nextDouble()*10;
      IlvDefaultSDMNode army = makeGroup("Army "+affiliations[aff],affiliations[aff],"UCFH--","-K",null);     //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$
      for (int func = 0; func < functions.length; func++) {
        double dxf = r.nextDouble()*4;
        double dyf = r.nextDouble()*4;
      IlvDefaultSDMNode division = makeGroup("Division "+functions[func],affiliations[aff],functions[func],"-I",army);         //$NON-NLS-1$ //$NON-NLS-2$
      for (int mob = 0; mob < mobilities.length; mob++) {
        double dxm = r.nextDouble()*1;
        double dym = r.nextDouble()*1;
      IlvDefaultSDMNode regiment = makeGroup("Regiment "+mobilities[mob],affiliations[aff],functions[func],"-G",division);         //$NON-NLS-1$ //$NON-NLS-2$
      for (int j = 1; j < 9; j++) {
        double dx = r.nextDouble()*0.25;
        double dy = r.nextDouble()*0.25;
//JV-3867 
        IlvApp6aSymbol s = new IlvApp6aSymbol("SFGPUCFHS---CUS-", Math.toRadians(-7 + dx+dxm+dxf+dxa), Math.toRadians(45-7 + dy+dym+dyf+dya));//$NON-NLS-1$
        s.setIDAffiliation(affiliations[aff]);
        s.setIDFunction(units[func]);
        s.setIDSizeMobility(mobilities[mob]);
        // use IlvApp6aSymbol.MODIFIER_UNIQUE_DESIGNATION rather than name to have it show on the symbol
        s.setProperty("name", units[func]+mobilities[mob]+"("+j+")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
        addObject(s, regiment, null);
      }
      }
      }
    }
    // we indicate the map builder that it is not necessary to ask for saving
    // this data.
    // make sure group is at the right place.
    setAdjusting(false);
  }
  private IlvDefaultSDMNode makeGroup(String name,String aff, String func,String mobility,IlvSDMNode parent) {
    //IlvDefaultSDMNode grp = (IlvDefaultSDMNode) engine.getModel().createNode("group");
    IlvApp6aSymbol grp=new IlvApp6aSymbol("group","SFGPUCFHS---CUS-",0,0);  //$NON-NLS-1$//$NON-NLS-2$
    grp.setIDAffiliation(aff);
    grp.setIDFunction(func);
    grp.setIDSizeMobility(mobility);
//uncomment to show name on the symbol:
// engine.getModel().setObjectProperty(grp, IlvApp6aSymbol.MODIFIER_UNIQUE_DESIGNATION, name);
    setObjectProperty(grp, "name", name); //$NON-NLS-1$
    addObject(grp, parent, null);
    return grp;
  }
  
 
}