package org.lucci.madhoc.simulation.monitor;
import java.awt.Component;
import java.awt.GridLayout;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Vector;

import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.border.TitledBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import org.lucci.madhoc.gui.MonitorView;
import org.lucci.madhoc.simulation.Monitor;
import org.lucci.madhoc.simulation.measure.DistributionSensor;
import org.lucci.madhoc.simulation.measure.MeasureHistory;
import org.lucci.madhoc.simulation.measure.Sensor;
import org.lucci.madhoc.simulation.projection.Projection;
import org.lucci.math.StatisticalCounter;
import org.lucci.up.SwingPlotter;
import org.lucci.up.data.Figure;
import org.lucci.up.data.FigureFactory;
import org.lucci.up.data.rendering.point.HistogramPointRenderer;

public class DistributionMeasure2DGraphicalView extends MonitorView
{
    private List<DistributionPlotter> plotters = new Vector<DistributionPlotter>();
    private JList measureList = new JList();
    private ListSelectionListener listSelectionListener = new ListSelectionHandler();


    public void setMonitor(Monitor application)
    {
        plotters.add(new DistributionPlotter());
        plotters.add(new DistributionPlotter());
        super.setMonitor(application);
        setLayout(new GridLayout(1, 3));        

        for (SwingPlotter plotter : plotters)
        {
            add(plotter);
        }

        harvestMeasures();
        add(createConfPanel());
    }

    private JPanel createConfPanel()
    {
        JPanel panel = new JPanel(new GridLayout(1, 1));
        
        {
            measureList.setListData(new Vector<Sensor>(harvestMeasures()));
            measureList.setCellRenderer(new ListRenderer());
            measureList.setBorder(new TitledBorder("Measures"));
            measureList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            panel.add(measureList);
            measureList.addListSelectionListener(listSelectionListener);
        }

        return panel;
    }

    private List<Sensor> harvestMeasures()
    {
        List<Sensor> sensors = new Vector<Sensor>();

        for (Monitor monitor : getMonitor().getNetwork().getMonitorMap().values())
        {
            List<DistributionSensor> appMeasures = new Vector<DistributionSensor>(monitor.findDistributionMeasures());
            Collections.sort(appMeasures, new Comparator()
                {
                    public int compare(Object arg0, Object arg1)
                    {
                        Sensor s0 = (Sensor) arg0;
                        Sensor s1 = (Sensor) arg1;
                        return s0.getName().compareTo(s1.getName());
                    }
                });
            sensors.addAll(appMeasures);
        }
        
        return sensors;
    }


    public String getName()
    {
        return "distribution plotter";
    }

    

    /* (non-Javadoc)
     * @see org.lucci.madhoc.ui.ApplicationView#updateView()
     */
    public void updateViewContent()
    {
        for (DistributionPlotter plotter : plotters)
        {
            if (plotter.getSensor() != null)
            {
                MeasureHistory measureHistory = getProjectionComponent().getProjection().getMeasureHistoryMap().get(plotter.getSensor());
                StatisticalCounter lastValue = (StatisticalCounter) measureHistory.getLastValue();
                Figure fig = FigureFactory.createFigure(lastValue.getRelativeMap());
                HistogramPointRenderer renderer = new HistogramPointRenderer();
                renderer.setFillColor(plotter.getSensor().getMonitor().getColor());
                fig.addRenderer(renderer);
                plotter.getGraphics2DPlotter().setFigure(fig);
                plotter.getGraphics2DPlotter().getSpace().getLegend().setText(plotter.getSensor().getName());
                plotter.getGraphics2DPlotter().getSpace().getYDimension().getLegend().setText(plotter.getSensor().getTargetSetName() + " ratio");
                plotter.repaint(0);
            }
        }
    }
    


    public class ListSelectionHandler implements ListSelectionListener
    {
        /* (non-Javadoc)
         * @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent)
         */
        public void valueChanged(ListSelectionEvent event)
        {
            if (!event.getValueIsAdjusting())
            {
                DistributionSensor sensor = (DistributionSensor) measureList.getSelectedValue();
                
                if (sensor != null)
                {
                    plotters.get(0).setSensor(sensor);
                    updateViewContent();
                    Collections.swap(plotters, 0, 1);
                }
            }
        }
    }
    
    public class ListRenderer extends DefaultListCellRenderer
    {
        /* (non-Javadoc)
         * @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
         */
        public Component getListCellRendererComponent(JList arg0, Object arg1, int arg2, boolean arg3, boolean arg4)
        {
            super.getListCellRendererComponent(arg0, arg1, arg2, arg3, arg4);
            Sensor sensor = (Sensor) arg1;
            setBackground(sensor.getMonitor().getColor());
            setText(" " + sensor.getName() + " ");
            return this;
        }
    }

    public void configure() throws Throwable
    {
        // TODO Auto-generated method stub
        
    }
}