package com.dlsc.flexgantt.showcase.demo.timenow;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.util.Calendar;

import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import com.dlsc.flexgantt.showcase.AbstractDemo;
import com.dlsc.flexgantt.showcase.DemoControlsPanel;
import com.dlsc.flexgantt.model.ITimeSpan;
import com.dlsc.flexgantt.model.TimeSpan;
import com.dlsc.flexgantt.model.dateline.DatelineModelException;
import com.dlsc.flexgantt.model.dateline.IDatelineModel;
import com.dlsc.flexgantt.model.dateline.TimeGranularity;
import com.dlsc.flexgantt.model.gantt.DefaultGanttChartNode;
import com.dlsc.flexgantt.model.gantt.DefaultTimelineObject;
import com.dlsc.flexgantt.model.gantt.TimelineObjectPath;
import com.dlsc.flexgantt.swing.GanttChart;
import com.dlsc.flexgantt.swing.GanttChartFrame;
import com.dlsc.flexgantt.swing.layer.timeline.DefaultTimelineObjectRenderer;
import com.dlsc.flexgantt.swing.layer.timeline.TimelineObjectLayer;
import com.dlsc.flexgantt.swing.timeline.TimeNowThread;

public class TimeNowDemo extends AbstractDemo {

    public TimeNowDemo() {
        super("Time Now");
    }

    @Override
    public String[] getSourceCodeFileNames() {
        return new String[] { "TimeNowDemo", "TimeNowDemoModel" };
    }

    @Override
    public void run(boolean embedded) {
        GanttChart gc = createGanttChart();
        final TimeNowDemoModel model = new TimeNowDemoModel();
        gc.setModel(model);

        gc.getLayerContainer().setTimelineObjectRenderer(
                DefaultTimelineObject.class, new ColoredRenderer());
        gc.getTreeTable().setRootVisible(false);
        gc.getTreeTable().setAlternatingBackground(new Color(240, 240, 240));
        gc.getLayerContainer().setAlternatingBackground(
                new Color(240, 240, 240));
        gc.getKeyColumn().setWidth(150);
        gc.resetToPreferredSizes();

        IDatelineModel datelineModel = gc.getDatelineModel();
        try {
            Calendar s = Calendar.getInstance();
            Calendar e = Calendar.getInstance();
            e.add(Calendar.HOUR_OF_DAY, 2);
            ITimeSpan span = new TimeSpan(s, e);
            datelineModel.setTimeSpan(span);
            datelineModel.setGranularity(TimeGranularity.FIVE_SECONDS);
        } catch (DatelineModelException e) {
            e.printStackTrace();
        }
        gc.setTimeNowVisible(true);
        gc.setTimeNowScrolling(true);
        TimeNowThread timeNowThread = new TimeNowThread(gc);
        timeNowThread.start();
        Thread thread = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i += 4) {
                    addTimelineObject(i);
                }
                while (true) {
                    addTimelineObject((int) (Math.random() * 100));
                    try {
                        sleep(1000);
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                }
            }

            private void addTimelineObject(int row) {
                Calendar s = Calendar.getInstance();
                s.add(Calendar.SECOND, 5 + (int) (Math.random() * 10));
                Calendar e = Calendar.getInstance();
                e.setTimeInMillis(s.getTimeInMillis());
                e.add(Calendar.SECOND, Math.max(1, (int) (Math.random() * 50)));
                ITimeSpan span = null;
                if (Math.random() > 0.8) {
                    span = new TimeSpan(s);
                } else {
                    span = new TimeSpan(s, e);
                }
                DefaultTimelineObject tlo = new DefaultTimelineObject(span);
                tlo.setPopupObject(s.getTime().toString(), false);
                switch ((int) (Math.random() * 3)) {
                case 0:
                    tlo.setProperty("color", Color.ORANGE);
                    break;
                case 1:
                    tlo.setProperty("color", Color.GREEN);
                    break;
                case 2:
                    tlo.setProperty("color", Color.LIGHT_GRAY);
                    break;
                case 3:
                    tlo.setProperty("color", Color.CYAN);
                    break;
                }
                DefaultGanttChartNode node = model.node[row];
                node.addTimelineObject(model.layer, tlo);
            }
        };
        thread.start();

        GanttChartFrame frame = createFrame("Time Now", gc, embedded);
        
        DemoControlsPanel controls = new DemoControlsPanel(this);
        frame.add(BorderLayout.EAST, controls);
        
        frame.setVisible(true);
    }

    class ColoredRenderer extends DefaultTimelineObjectRenderer {

        public ColoredRenderer() {
            setVisualizingPastTime(true);
        }

        @Override
        public Component getTimelineObjectRendererComponent(
                TimelineObjectLayer layer, TimelineObjectPath path,
                boolean selected, boolean hasFocus, boolean highlighted, int row) {
            Component comp = super.getTimelineObjectRendererComponent(layer,
                    path, selected, hasFocus, highlighted, row);
            DefaultTimelineObject obj = (DefaultTimelineObject) getTimelineObject();
            setBackground((Color) obj.getProperty("color"));
            return comp;
        }
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        SwingUtilities.invokeLater(new TimeNowDemo());
    }
}
