package icy.gui.frame.error;

import icy.gui.frame.IcyFrame;
import icy.gui.frame.TitledFrame;
import icy.gui.frame.progress.ProgressFrame;
import icy.system.IcyExceptionHandler;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.text.BadLocationException;

public class ErrorReportFrame extends TitledFrame implements ActionListener
{
    /**
     * This function test if we already have an active error report frame opened.
     */
    public static boolean hasErrorFrameOpened()
    {
        return !IcyFrame.getAllFrames(ErrorReportFrame.class).isEmpty();
    }

    // GUI
    protected ErrorReportPanel panel;

    // internals
    protected ActionListener reportAction;

    /**
     * Create the frame.
     */
    public ErrorReportFrame(Icon icon, String title, String message)
    {
        super("Bug report", true, true, true, true);

        panel = new ErrorReportPanel(icon, title, message);

        panel.reportButton.addActionListener(this);
        panel.closeButton.addActionListener(this);

        // default report action
        reportAction = new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                final ProgressFrame progressFrame = new ProgressFrame("Sending report...");

                try
                {
                    IcyExceptionHandler.report(panel.getReportMessage());
                }
                catch (BadLocationException ex)
                {
                    System.err.println("Error while reporting error :");
                    IcyExceptionHandler.showErrorMessage(ex, true);
                }
                finally
                {
                    progressFrame.close();
                }
            }
        };

        mainPanel.add(panel, BorderLayout.CENTER);

        addToDesktopPane();
        setSize(new Dimension(520, 450));
        setVisible(true);
        requestFocus();
        center();
    }

    /**
     * Returns formatted report message (ready to send to web site).
     * 
     * @throws BadLocationException
     */
    public String getReportMessage() throws BadLocationException
    {
        return panel.getReportMessage();
    }

    /**
     * Set a specific action on the report button
     */
    public void setReportAction(ActionListener action)
    {
        reportAction = action;
    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        if ((e.getSource() == panel.reportButton) && (reportAction != null))
            reportAction.actionPerformed(e);

        close();
    }
}