/*
 * -------------------------------------------------------------------------
 *      $Id: ChartReturns.java,v 1.6 2004/05/26 18:54:54 estewart Exp $
 * -------------------------------------------------------------------------
 *      Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved.
 *
 *      This software is confidential information which is proprietary to
 *      and a trade secret of Visual Numerics, Inc.  Use, duplication or
 *      disclosure is subject to the terms of an appropriate license
 *      agreement.
 *
 *      VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
 *      SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
 *      BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
 *      FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL
 *      NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 *      AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
 *      ITS DERIVATIVES.
 *--------------------------------------------------------------------------
 */

package com.imsl.demo.risk;
import com.imsl.chart.*;
import com.imsl.stat.Summary;
import java.text.*;
import javax.swing.*;

/**
 *
 * @author  brophy
 * @created January 31, 2002
 */
public class ChartReturns  extends JFrameChart {
    private Database    db;
    private AxisXY      axis;
    private Bar         bar;
    private Statistics  statistics;
    private Options     options;

    /** Creates new ChartReturns */
    public ChartReturns(Database db, String ticker) {
        this.db = db;
        setTitle("Risk Analysis");

        Object l[] = getListeners(java.awt.event.WindowListener.class);
        for (int k = 0;  k < l.length;  k++) {
            removeWindowListener((java.awt.event.WindowListener)l[k]);
        }

        Chart chart = getChart();
        chart.setTextColor("purple");
        //chart.getBackground().setFillColor(new java.awt.Color(240,240,240));
        axis = new AxisXY(chart);
        axis.getAxisX().getAxisTitle().setTitle("Daily Returns");
        axis.getAxisY().getAxisTitle().setTitle("Probability");
        axis.getAxisX().getAxisLabel().setTextFormat(new java.text.DecimalFormat("0.0%"));
        axis.getAxisY().getAxisLabel().setTextFormat(new java.text.DecimalFormat("0%"));

        statistics = new Statistics();
        statistics.setLocation(100,300);
        statistics.show();

        String tickers[] = db.getTickers();
        compute(tickers[0]);
        options = new Options(tickers);
        options.setLocation(25,500);
        options.show();
    }


    public void setVisible(boolean vis) {
        super.setVisible(vis);
        if (vis) {
            java.awt.Point chartLoc = getLocationOnScreen();
            java.awt.Dimension optionsSize = options.getSize();
            options.setLocation(chartLoc.x-optionsSize.width,chartLoc.y);

            java.awt.Dimension statSize = statistics.getSize();
            statistics.setLocation(chartLoc.x-statSize.width,chartLoc.y+optionsSize.height);
        }
        statistics.setVisible(vis);
        options.setVisible(vis);
    }


    private void compute(String ticker) {
        if (bar != null)  bar.remove();

        Database.Series series = db.getSeries(ticker);
        int nSamples = series.close.length - 1;
        int nBins = 50;
        double max = 0.05;

        Summary s = new Summary();

        // Setup the bins
        double bins[] = new double[nBins];
        double dx = 2.*max/nBins;
        double x[] = new double[nBins];
        for (int k = 0;  k < nBins;  k++) {
            x[k] = -max + (k+0.5)*dx;
        }

        for (int k = 0;  k < nSamples;  k++) {
            double t = (series.close[k+1]-series.close[k])/series.close[k];
            s.update(t);
            int j = (int)Math.round((t+max-0.5*dx)/dx);
            if (j >= 0  &&  j < nBins)  bins[j]++;
        }

        getChart().getChartTitle().setTitle("Returns for "+ticker.toUpperCase());
        for (int k = 0;  k < bins.length;  k++)  bins[k] /= nSamples;
        bar = new Bar(axis, x, bins);
        bar.setBarType(Data.BAR_TYPE_VERTICAL);
        bar.setFillColor("green");
        bar.setBarWidth(0.5*dx);

        StringBuffer sb = new StringBuffer(2048);
        sb.append("<html><body>");
        sb.append("<p align='center'><b>"+ticker+"</b></p>");
        sb.append("<table>");
        appendRow(sb, "Mean", s.getMean());
        appendRow(sb, "StandardDeviation", s.getStandardDeviation());
        appendRow(sb, "Variance", s.getVariance());
        appendRow(sb, "Skewness", s.getSkewness());
        appendRow(sb, "Kurtosis", s.getKurtosis());
        sb.append("</table></body></html>");
        statistics.setText(sb.toString());
        statistics.repaint();
    }

    static final DecimalFormat formatStat = new DecimalFormat("0.00E0");

    private void appendRow(StringBuffer sb, String title, double value) {
        sb.append("<tr><td align='right'><i>");
        sb.append(title);
        sb.append("</i></td><td align='left'>");
        sb.append(formatStat.format(value));
        sb.append("</td><tr>");
    }


    private class Options extends JDialog {
        public Options(final String tickers[]) {
            super(ChartReturns.this, false);
            setTitle("Select");
            getContentPane().setLayout(new java.awt.GridLayout(tickers.length, 0));
            ButtonGroup group = new ButtonGroup();
            for (int k = 0;  k < tickers.length;  k++) {
                final String ticker = tickers[k];
                JRadioButton button = new JRadioButton(tickers[k]);
                group.add(button);
                button.setSelected(k == 0);
                button.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        compute(ticker);
                        ChartReturns.this.repaint();
                    }
                });
                getContentPane().add(button);
            }
            pack();
        }
    }


    private class Statistics extends JDialog {
        private JEditorPane jEditorPane;

        public Statistics() {
            super(ChartReturns.this, false);
            setTitle("Statistics");
            jEditorPane = new javax.swing.JEditorPane();
            jEditorPane.setContentType("text/html");
            jEditorPane.setPreferredSize(new java.awt.Dimension(250,250));
            getContentPane().add(jEditorPane);
            pack();
        }

        void setText(String text) {
            jEditorPane.setText(text);
        }
    }
}