package com.dhtxb.ui.nav.data;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Paint;
import java.awt.Stroke;
import java.awt.geom.Rectangle2D;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.swing.JPanel;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.MouseWheelHandler;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.panel.CrosshairOverlay;
import org.jfree.chart.plot.Crosshair;
import org.jfree.chart.plot.DefaultDrawingSupplier;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.chart.ui.RectangleEdge;
import org.jfree.data.general.DatasetUtils;
import org.jfree.data.time.RegularTimePeriod;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;

import com.common.comm.swt.composite.Composite0;
import com.common.comm.swt.composite.CustomSashForm_1;
import com.common.comm.swt.composite.GridData0;
import com.common.nattable.page.DummyGridLayerStack;
import com.common.nattable.table.DefaultNatTable;
import com.common.nattable.table.NDefaultTable;

/**
 * 
 * @author VINCENT ZHANG
 * @date 2025年11月11日
 */
public class SocketDataComposite extends Composite {
    public static final Color DARK_81 = new Color(81, 86, 88);
    public static final Color DARK_47 = new Color(80, 100, 110); // 70,90,100
    public static final Color GRAY_200 = new Color(200, 200, 200);
    protected static Paint[] Theme_Color1 = new Paint[] {Color.decode("0xFFFF00"),
            Color.decode("0x0036CC"), Color.decode("0xFF0000"),
            Color.decode("0xFFFF7F"), Color.decode("0x6681CC"),
            Color.decode("0xFF7F7F"), Color.decode("0xFFFFBF"),
            Color.decode("0x99A6CC"), Color.decode("0xFFBFBF"),
            Color.decode("0xA9A938"), Color.decode("0x2D4587")};
    protected static Paint[] Theme_Color2 = new Paint[] {Color.decode("0xFFFF00"),
            Color.decode("0x0036CC")};
    public static final Font Font_10 = new Font("Tahoma", Font.BOLD, 15);
    
    private static final String[] header = {
            "生成时间",
            "老化电流",
            "温度",
            "NTC",
            "测试项",
            "测试值",
            "状态"};
    
    DummyGridLayerStack layer;
    NDefaultTable defaultTable;
    DefaultNatTable natTable;
    
    public SocketDataComposite(Composite parent, int style) {
        super(parent, style);
        
        setLayout(new GridLayout());
        setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        
        SashForm sashForm = new CustomSashForm_1(this, SWT.DOUBLE_BUFFERED | SWT.HORIZONTAL);
        sashForm.setLayoutData(GridData0.builder().setBothFill(2, 1).get());
        Composite left = Composite0.builder()
                .setGrabExcessVerticalSpace(true)
                .setHorizontalSpacing(0).get(sashForm, SWT.EMBEDDED | SWT.NO_BACKGROUND);
        Composite right = Composite0.builder()
                .setGrabExcessVerticalSpace(true)
                .setHorizontalSpacing(0).get(sashForm, SWT.NONE);
        sashForm.setWeights(new int[] { 50, 50 });
        
        Map<Integer, TimeSeriesCollection> datasets = createDataset();
        Frame frame = SWT_AWT.new_Frame(left);
        //JPanel panel = createPanel(k, "PART ID", v);
        JPanel panel = createPanel("Cabinet1-Drawer1-S1", datasets);
        frame.add(panel);
        
    }
    
    private Map<Integer, TimeSeriesCollection> createDataset() {
        Map<Integer, TimeSeriesCollection> xySeries = new LinkedHashMap<>();
        for (int i = 0; i < 2; i++) {
            TimeSeries series = new TimeSeries("I"+i);
            RegularTimePeriod period = (RegularTimePeriod)new Second();
            double value = 100.0D;
            for (int j = 0; j < 20000; j++) {
                series.add(period, value);
                period = period.next();
                value *= 1.0D + (Math.random() - 0.495D) / 10.0D;
            }
            TimeSeriesCollection dataset = new TimeSeriesCollection();
            dataset.addSeries(series);
            xySeries.put(i, dataset);
        }
        return xySeries;
    }

    public JPanel createPanel(String xTitle, Map<Integer, TimeSeriesCollection> xySeries) {
        JFreeChart chart = createPolyline(xySeries, xTitle, xTitle, "xxx/I");
        SChartPanel panel = new SChartPanel(chart);
        panel.setDoubleBuffered(true);
        panel.setOpaque(true);
        panel.setMouseZoomable(false);
        panel.setDomainZoomable(true);
        panel.setRangeZoomable(true);
        panel.addMouseWheelListener(new MouseWheelHandler(panel));
        
        //panel.setMouseWheelEnabled(true);
        Crosshair xCrosshair = new Crosshair(Double.NaN, Color.WHITE, new BasicStroke(0.5F));
        xCrosshair.setLabelPaint(Color.WHITE);
        xCrosshair.setLabelBackgroundPaint(Color.BLACK);
        xCrosshair.setLabelOutlinePaint(Color.BLACK);
        Crosshair[] yCrosshairs = new Crosshair[xySeries.size()];
        CrosshairOverlay crosshairOverlay = new CrosshairOverlay();
        xCrosshair.setLabelVisible(true);
        crosshairOverlay.addDomainCrosshair(xCrosshair);
        for (int i = 0; i < xySeries.size(); i++) {
          yCrosshairs[i] = new Crosshair(Double.NaN, Color.WHITE, new BasicStroke(0.5F));
          yCrosshairs[i].setLabelPaint(Color.WHITE);
          yCrosshairs[i].setLabelBackgroundPaint(Color.BLACK);
          yCrosshairs[i].setLabelOutlinePaint(Color.BLACK);
          yCrosshairs[i].setLabelVisible(true);
          crosshairOverlay.addRangeCrosshair(yCrosshairs[i]);
        }
        panel.setOverlay(crosshairOverlay);
        panel.addChartMouseListener(new ChartMouseListener() {
            
            @Override
            public void chartMouseMoved(ChartMouseEvent event) {
                Rectangle2D dataArea = panel.getScreenDataArea();
                JFreeChart chart = event.getChart();
                XYPlot plot = (XYPlot)chart.getPlot();
                ValueAxis xAxis = plot.getDomainAxis();
                double x = xAxis.java2DToValue(event.getTrigger().getX(), dataArea, RectangleEdge.BOTTOM);
                xCrosshair.setValue(x);
                Map<Integer, XYDataset> datasets = plot.getDatasets();
                Set<Entry<Integer, XYDataset>> entrySet = datasets.entrySet();
                for (Entry<Integer, XYDataset> e : entrySet) {
                    XYDataset value = e.getValue();
                    double y = DatasetUtils.findYValue(value, 0, x);
                    yCrosshairs[e.getKey()].setValue(y);
                    String string = value.getSeriesKey(0).toString();
                    System.out.println(string + "   " + y);
                    if (string.equals("I1")) {
                        double y1 = DatasetUtils.findYValue(value, 0, x);
                        if (((int)y1)==64) {
                            DatasetUtils.findYValue(value, 0, x);
                        }
                        yCrosshairs[e.getKey()].setValue(y1);
                    }
                    
                }
            }
            
            @Override
            public void chartMouseClicked(ChartMouseEvent event) {}
        });

        return (JPanel) panel;
    }
    
    private JFreeChart createPolyline(Map<Integer, TimeSeriesCollection> xySeries, String title, String xTitle, String yTitle) {
        //JFreeChart chart = ChartFactory.createXYLineChart(title, xTitle, yTitle, dataset,
        //        PlotOrientation.VERTICAL, true, true, false);
        Set<Entry<Integer, TimeSeriesCollection>> entrySet = xySeries.entrySet();
        Iterator<Entry<Integer, TimeSeriesCollection>> iterator = entrySet.iterator();
        Entry<Integer, TimeSeriesCollection> next = iterator.next();
        JFreeChart chart = ChartFactory.createTimeSeriesChart(title, xTitle, yTitle, next.getValue(),
                true, true, false);
        chart.setAntiAlias(true);
        chart.setTextAntiAlias(true);
        
        StandardChartTheme darkTheme = (StandardChartTheme)StandardChartTheme.createDarknessTheme();
        darkTheme.setDrawingSupplier(new DefaultDrawingSupplier(
                Theme_Color1,
                Theme_Color2,
                new Stroke[] {new BasicStroke(1f)},
                new Stroke[] {new BasicStroke(0.5f)},
                DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE));
        darkTheme.apply(chart);
        // 下面的Title
        LegendTitle legend = chart.getLegend();
        if (legend != null) {
            legend.setBackgroundPaint(DARK_47);
            legend.setItemPaint(Color.WHITE);
        }
        // 上面的Title
        TextTitle title_ = chart.getTitle();
        title_.setFont(Font_10);
        chart.setBackgroundPaint(DARK_47);
        
        // 折现区域
        XYPlot plot = (XYPlot) chart.getPlot();
        plot.setBackgroundPaint(null);
        plot.setDomainPannable(true);
        plot.setRangePannable(true);
        plot.setDomainZeroBaselineVisible(true);
        plot.setRangeZeroBaselineVisible(true);
        //plot.setDomainCrosshairVisible(true);
        //plot.setRangeCrosshairVisible(true);
        
        plot.setOutlineVisible(false);
        plot.setOutlinePaint(GRAY_200);
        
        XYItemRenderer renderer = new XYLineAndShapeRenderer(true, false);
        plot.setRenderer(1, renderer);
        
        NumberAxis rangeAxisY = (NumberAxis) plot.getRangeAxis();
        rangeAxisY.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        rangeAxisY.setLabel(yTitle);
        //rangeAxisY.setNumberFormatOverride(new java.text.DecimalFormat("0.00"));
        
        DateAxis domainAxis = (DateAxis)plot.getDomainAxis();
        domainAxis.setLabel("Time");
        domainAxis.setDateFormatOverride(new SimpleDateFormat("MM-dd HH:mm:ss"));
        
        int index = 1;
        while(iterator.hasNext()) {
            Entry<Integer, TimeSeriesCollection> n = iterator.next();
            TimeSeriesCollection value = n.getValue();
            String name = value.getSeriesKey(0).toString();
            NumberAxis axis2 = new NumberAxis(name);
            axis2.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            //axis2.setAutoRangeIncludesZero(false);
            plot.setRangeAxis(index, (ValueAxis)axis2);
            plot.setRangeAxisLocation(index, AxisLocation.BOTTOM_OR_LEFT);
            
            plot.setDataset(index, value);
            plot.mapDatasetToRangeAxis(index, index);
            //StandardXYItemRenderer standardXYItemRenderer1 = new StandardXYItemRenderer();
            //plot.setRenderer(index, (XYItemRenderer)standardXYItemRenderer1);
            index++;
        }
        
        return chart;
    }
}
