/**
* Vimshottari.java
* Created On 2006, Mar 22, 2006 6:42:45 PM
* @author E. Rajasekar
*/
package app.astrosoft.core;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.EnumMap;
import java.util.Enumeration;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import app.astrosoft.consts.AstroConsts;
import app.astrosoft.consts.AstrosoftTableColumn;
import app.astrosoft.consts.DisplayFormat;
import app.astrosoft.consts.Planet;
import app.astrosoft.core.VimDasa.DasaIterator;
import app.astrosoft.export.Exportable;
import app.astrosoft.export.Exporter;
import app.astrosoft.ui.table.DefaultColumnMetaData;
import app.astrosoft.ui.table.TableData;
import app.astrosoft.ui.table.TableDataFactory;
import app.astrosoft.ui.table.TableRowData;
import app.astrosoft.util.AstroUtil;
public class Vimshottari implements Exportable {
public static final int MAX_LEVEL = 3;
public static Format dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
private Planet startLord;
private double balance;
private EnumMap<Planet, Dasa> dasa;
private Dasa currentDasa;
private DefaultMutableTreeNode root;
private static DefaultColumnMetaData vimDasaTableColumnMetaData;
public Vimshottari(double moonLongitude, Calendar bday) {
startLord = getDasaLord(moonLongitude);
balance = computeBalance(moonLongitude);
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(bday.getTime());
double birth = AstroUtil.dateToDecimalYear(cal);
double start = ( birth + balance ) - startLord.dasaPeriod();
dasa = VimDasa.generateSubDasas(startLord, null, start, 0);
currentDasa = getCurrent();
}
private Planet getDasaLord(double lon) {
double i = 0;
for (i = 0; i <= 26; i++) {
if (((i * (AstroConsts.nakLength )) <= lon)
&& (lon < ((i + 1) * (AstroConsts.nakLength )))) {
break;
}
}
return Planet.ofDasaNo((int) (i + 7));
}
private double computeBalance(double moonLongitude) {
double balance = moonLongitude % AstroConsts.nakLength;
balance = AstroConsts.nakLength - balance;
balance = balance * 60;
return ( balance * startLord.dasaPeriod() ) / 800;
}
public EnumMap<Planet, Dasa> getDasa() {
return dasa;
}
public String getBalance() {
StringBuilder sb = new StringBuilder("Bal of ");
sb.append(startLord.toString(DisplayFormat.SYMBOL));
sb.append(" Dasa ");
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(AstroUtil.decimalYearToDate(balance));
int year = balance < 1 ? 0 : cal.get(Calendar.YEAR);
sb.append(year + "y ");
sb.append(cal.get(Calendar.MONTH) + "m ");
sb.append(cal.get(Calendar.DATE) + "d ");
return sb.toString();
}
public Dasa getCurrent(){
Dasa current = null;
for(Dasa d : dasas()){
if(d.isRunning()){
current = d.getCurrent();
}
}
return current;
}
public Iterable<Dasa> dasas() {
return new VimDasa.DasaIterable(startLord, dasa);
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
for(Dasa d : dasas()){
sb.append(d.printTree());
}
return sb.toString();
}
public DefaultMutableTreeNode getRoot() {
if (root == null){
createTreeNode();
}
return root;
}
public void createTreeNode(){
root = new DefaultMutableTreeNode(new VimDasa());
for(Dasa d : dasas()){
root.add(d.createTreeNode());
}
/*System.out.println(printDasaTree());
System.out.println(getCurrentDasaPath());*/
}
public DefaultTreeModel getDasaTreeModel(){
createTreeNode();
return new DefaultTreeModel(root);
}
public TreePath getCurrentDasaPath(){
TreePath path = null;
Enumeration e = root.breadthFirstEnumeration();
while(e.hasMoreElements()){
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.nextElement();
if (currentDasa == node.getUserObject()){
path = new TreePath(node.getPath());
}
}
return path;
}
public String printDasaTree(){
StringBuilder sb = new StringBuilder();
Enumeration e = root.breadthFirstEnumeration();
while(e.hasMoreElements()){
sb.append(e.nextElement() + " , ");
}
return sb.toString();
}
public TableData<Dasa> getVimDasaTableData(Dasa dasa){
return TableDataFactory.getTableData(dasa.subDasas());
}
public TableData<Dasa> getVimDasaTableData() {
return TableDataFactory.getTableData(dasas());
}
public static DefaultColumnMetaData getVimDasaTableColumnMetaData() {
if (vimDasaTableColumnMetaData == null){
vimDasaTableColumnMetaData = new DefaultColumnMetaData(AstrosoftTableColumn.Dasa, AstrosoftTableColumn.Start, AstrosoftTableColumn.End);
vimDasaTableColumnMetaData.localizeColumns(AstrosoftTableColumn.Dasa);
}
return vimDasaTableColumnMetaData;
}
public Planet getStartLord() {
return startLord;
}
public static void main(String[] args) {
Vimshottari v = new Vimshottari(300 + ( 59.00 / 60.00 ), new GregorianCalendar(1980, Calendar.DECEMBER, 11));
//v.getDasa().get(Planet.Rahu).getSubDasas();
//v.getDasa().get(Planet.Venus).getSubDasas().get(Planet.Venus).getSubDasas();
//System.out.println(v);
//System.out.println("Current:-> " + v.getCurrent());
EnumMap<Planet, Dasa> dasa = v.getDasa();
for(Planet p : Planet.dasaLords(v.getStartLord())){
Dasa d = dasa.get(p);
for(Dasa sb : d.subDasas()) {
System.out.println(TableDataFactory.toCSV(v.getVimDasaTableData(sb),getVimDasaTableColumnMetaData()));
System.out.println("**********************************************************");
}
System.out.println("---------------------------------------------------------");
}
//System.out.println(TableDataFactory.toCSV(v.getVimDasaTableData(),getVimDasaTableColumnMetaData()));
//System.out.println(v.printDasaTree());
}
public void doExport(Exporter e) {
e.export(this);
}
}