package net.methodyne.demo;

import net.methodyne.bellvue.core.Sdata;

import java.util.*;
import java.io.Serializable;
import java.io.IOException;

import org.jfree.data.time.*;
import org.jfree.data.XYDataset;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.StandardXYItemRenderer;
import org.jfree.chart.renderer.XYItemRenderer;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;


public class Account  implements Serializable{
    //private static final long serialVersionUID = 1L;
    public long id = -1l;
    public String title = "my Account";
    public String type = "type";
    public Date plot_start = new Date();
    public Date plot_end = new Date();
    public String plot_period = "m";
    public Vector cashFlows = new Vector();
    public Vector referenceCashFlows = new Vector();

    public String dispPlot_start(Sdata sd){
        return "yyyy.MM.dd";
    }
    public String dispPlot_end(Sdata sd){
        return "yyyy.MM.dd";
    }

    public String getTitle() {
        return title;
    }

    public String dispPlot_period(Sdata sd){
        return "SELECT,m,y";
    }


    public String setPlot_period(String val, Sdata sd){
        String ret = null;
        if( " m y".indexOf(val) <= 0 ){
            return "Enter: m for monthly, y for yearly period.";
        }
        else{
            plot_period = val;
        }
        return ret;
    }
    public String typeCashFlows(){  return "net.methodyne.demo.CashFlow"; }

    public float getBalance(Date v) {
        float bal = 0;
        Calendar c = Calendar.getInstance();
        CashFlow cf;
        Iterator e = cashFlows.iterator();
        while (e.hasNext() ) {
            cf = (CashFlow) e.next();
            String p = cf.periodic;
            c.set(cf.first.getYear() + 1900, cf.first.getMonth(), cf.first.getDay());
            while ((c.getTime().getTime() <= v.getTime())
                    && (c.getTime().getTime() <= cf.last.getTime())) {
                bal += (cf.amount);
                if (p.length() == 1) {
                    if (p.compareTo("y") == 0) c.add(Calendar.YEAR, 1);
                    if (p.compareTo("q") == 0) c.add(Calendar.MONTH, 3);
                    if (p.compareTo("m") == 0) c.add(Calendar.MONTH, 1);
                    if (p.compareTo("w") == 0) c.add(Calendar.WEEK_OF_YEAR, 1);
                } else {
                    break;
                }
            }
        }
        return bal;
    }

    public String aboutPlotChart(Sdata sd){ return "on"; }

    public void actionPlotChart(Sdata sd) {
        String filename = accountPlot("Account line", sd );
	    String graphURL = sd.req.getContextPath() + "/DisplayChart?filename=" + filename;

        net.methodyne.bellvue.core.ResultObject r = new net.methodyne.bellvue.core.ResultObject();
        r.result = "<img src=\""+ graphURL + "\" width=500 height=300 border=0>";
        r.title = "Account balance time plot";
        sd.view.add(r);
    }

    public String accountPlot(String title, Sdata sd) {
        String filename = "";
        String chartTitle = "Account balance over time:";
        XYDataset dataset = createDataset();
        JFreeChart chart = ChartFactory.createTimeSeriesChart(chartTitle,  "Date", "Balance", dataset, true, true, true);
        chart.setBackgroundPaint(java.awt.Color.white);
        XYPlot plot = chart.getXYPlot();
        XYItemRenderer renderer = plot.getRenderer();
        if (renderer instanceof StandardXYItemRenderer) {
            StandardXYItemRenderer r = (StandardXYItemRenderer) renderer;
            r.setPlotShapes(true);
            r.setDefaultShapeFilled(true);
            //r.setDefaultShapeScale(5.0);
        }
        //  Write the chart image to the temporary directory
        ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
        try {
            filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, sd.req.getSession() );
        } catch (IOException e) {
            e.printStackTrace();
        }
        return filename;
    }

    public XYDataset createDataset() {
        String p = plot_period;
        TimeSeries s1 = null;
        if ((p.compareTo("y") == 0)
                || (p.compareTo("m") == 0)) {
            if (p.compareTo("y") == 0) {
                s1 = new TimeSeries(getTitle(), Year.class);
                Date x = new Date();
                x.setTime(plot_start.getTime());
                while (x.getTime() <= plot_end.getTime()) {
                    s1.add(new Year(1900 + x.getYear()), getBalance(x));
                    x.setYear(x.getYear() + 1);
                }
            }
            else if (p.compareTo("m") == 0) {
                s1 = new TimeSeries(getTitle(), Month.class);
                Date x = new Date();
                x.setTime(plot_start.getTime() );
                while (x.getTime() <= plot_end.getTime()) {
                    //System.out.println("mon: " + x.dateValue().getMonth() );
                    //System.out.println( x.toString() + " balance:" +  getBalance(x) );
                    s1.add(new Month(1 + x.getMonth(), 1900 + x.getYear()), getBalance(x));
                    x.setMonth( x.getMonth() + 1 );
                }
            }
        }
        TimeSeriesCollection dataset = new TimeSeriesCollection();
        dataset.addSeries(s1);
        //   dataset.addSeries(s2);
        return dataset;
    }

}