package scriptbuilder.gui.panels;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;
import scriptbuilder.gui.ScriptBuilderFrame;
import scriptbuilder.gui.ScriptBuilderGuiConstants;
import scriptbuilder.structures.ScriptIncident;
import scriptbuilder.structures.TimeSlice;

/**
 *
 * @author Greg Eddington <geddingt@calpoly.edu>
 */
public class IncidentNumberPanel extends JPanel
{
    ScriptIncident incident;
    boolean visible;
    public boolean collapsed = false;
    private static Image collapseImage = null, expandImage = null;

    private static Image getCollapseImage()
    {
        if (collapseImage == null)
        {
            try
            {
                collapseImage = ImageIO.read(images.Images.getImage("Collapse.png"));
            }
            catch (IOException ex)
            {
                Logger.getLogger(IncidentNumberPanel.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return collapseImage;
    }

    private static Image getExpandImage()
    {
        if (expandImage == null)
        {
            try
            {
                expandImage = ImageIO.read(images.Images.getImage("Expand.png"));
            }
            catch (IOException ex)
            {
                Logger.getLogger(IncidentNumberPanel.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return expandImage;
    }

    private class IncidentNumberMouseListener extends MouseInputAdapter
    {
        private final Shape collapseExpandButtonShape =
                new Rectangle(ScriptBuilderGuiConstants.COLLEX_BUTTON_X, 
                              ScriptBuilderGuiConstants.COLLEX_BUTTON_Y,
                              ScriptBuilderGuiConstants.COLLEX_BUTTON_WIDTH,
                              ScriptBuilderGuiConstants.COLLEX_BUTTON_HEIGHT);

        @Override
        public void mouseClicked(MouseEvent e)
        {
            if (collapseExpandButtonShape.contains(e.getX(), e.getY()))
            {
                incident.setCollapsed(!collapsed);
            }
        }
    }

    public IncidentNumberPanel()
    {
        super();

        // Add the mouse listener
        IncidentNumberMouseListener mouseListener =
                new IncidentNumberMouseListener();
        addMouseMotionListener(mouseListener);
        addMouseListener(mouseListener);
    }

    public void update(ScriptIncident incident)
    {
        this.incident = incident;
        this.visible = incident != null;

        if (incident != null)
            this.collapsed = incident.collapsed;

        Dimension newSize;
        if (visible)
        {
            if (collapsed)
            {
                newSize = new Dimension(
                        ScriptBuilderGuiConstants.INCIDENT_NUMBER_WIDTH,
                        ScriptBuilderGuiConstants.TIMELINE_COLLAPSED_HEIGHT);
            }
            else
            {
                int mostEvents = 0;
                for (TimeSlice slice : incident.slices)
                {
                    if (slice.events.size() > mostEvents)
                        mostEvents = slice.events.size();
                }

                newSize = new Dimension(ScriptBuilderGuiConstants.INCIDENT_NUMBER_WIDTH,
                        ScriptBuilderGuiConstants.TIMELINE_COLLAPSED_HEIGHT +
                        ScriptBuilderGuiConstants.SCRIPT_EVENT_ICON_STEP * (mostEvents + 1));
            }
        }
        else
        {
            newSize = new Dimension(0, 0);
        }
        this.setSize(newSize);
        this.setPreferredSize(newSize);

        if (incident != null)
            this.setToolTipText(incident.name);

        invalidate();
    }

    @Override
    public void paint(Graphics g)
    {
        super.paint(g);

        if (!visible)
            return;

        Graphics2D g2d = (Graphics2D)g;
        g2d.setColor(incident.color);
        g2d.setFont(ScriptBuilderGuiConstants.INCIDENT_NUMBER_FONT);
        g2d.drawString(Integer.toString(incident.number),
                ScriptBuilderGuiConstants.INCIDENT_NUMBER_LEFT_MARGIN,
                ScriptBuilderGuiConstants.INCIDENT_NUMBER_TOP_MARGIN);

        g2d.drawImage((collapsed ? getExpandImage() : getCollapseImage()),
                ScriptBuilderGuiConstants.COLLEX_BUTTON_X,
                ScriptBuilderGuiConstants.COLLEX_BUTTON_Y, null);

        if (!collapsed)
        {
            int y = ScriptBuilderGuiConstants.INCIDENT_NUMBER_TOP_MARGIN * 2 - 14;
            g2d.setFont(ScriptBuilderGuiConstants.INCIDENT_NAME_FONT);
            for (String line : incident.name.split(" "))
            {
                g2d.drawString(line, 20, y);
                y += 12;
            }
        }
    }
}
