package icy.gui.frame.error;

import icy.gui.component.IcyTextField;
import icy.preferences.GeneralPreferences;
import icy.system.IcyExceptionHandler;
import icy.util.StringUtil;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class ErrorReportPanel extends JPanel
{
    /**
     * 
     */
    private static final long serialVersionUID = -6672076887465746832L;

    // GUI
    JTextPane errorMessageTextPane;
    JTextPane commentTextPane;
    IcyTextField emailTextField;
    JButton reportButton;
    JButton closeButton;
    JLabel label;

    public ErrorReportPanel(Icon icon, String title, String message)
    {
        super();

        initialize();

        if (!StringUtil.isEmpty(title))
            label.setText(title);
        if (icon != null)
            label.setIcon(icon);

        try
        {
            errorMessageTextPane.getStyledDocument().insertString(errorMessageTextPane.getStyledDocument().getLength(),
                    message, new SimpleAttributeSet());
        }
        catch (BadLocationException e)
        {
            System.err.println("PluginErrorReport(...) error :");
            IcyExceptionHandler.showErrorMessage(e, true);
        }
        errorMessageTextPane.setCaretPosition(0);

        final Document doc = commentTextPane.getDocument();

        try
        {
            SimpleAttributeSet attributes = new SimpleAttributeSet();
            StyleConstants.setItalic(attributes, true);
            StyleConstants.setForeground(attributes, Color.GRAY);
            doc.insertString(0, "Please type here your comment", attributes);
        }
        catch (BadLocationException e1)
        {

        }

        commentTextPane.addMouseListener(new MouseAdapter()
        {
            // Displays a message at the beginning that
            // disappears when first clicked
            boolean firstClickDone = false;

            @Override
            public void mouseClicked(MouseEvent e)
            {
                if (!firstClickDone)
                {
                    commentTextPane.setText("");

                    SimpleAttributeSet attributes = new SimpleAttributeSet();
                    StyleConstants.setItalic(attributes, false);
                    StyleConstants.setForeground(attributes, Color.BLACK);
                    try
                    {
                        doc.insertString(0, " ", attributes);
                    }
                    catch (BadLocationException e1)
                    {
                    }

                    firstClickDone = true;
                }
            }
        });

        // set default email
        emailTextField.setText(GeneralPreferences.getUserEmail());
    }

    /**
     * @wbp.parser.constructor
     */
    ErrorReportPanel()
    {
        this(null, "Test", "An error occured");
    }

    private void initialize()
    {
        // top
        label = new JLabel("An error occured !", SwingConstants.CENTER);

        // center
        errorMessageTextPane = new JTextPane();
        errorMessageTextPane.setEditable(false);
        errorMessageTextPane.setContentType("text/html");

        JScrollPane messageScrollPane = new JScrollPane(errorMessageTextPane);

        JPanel messagePanel = new JPanel();
        messagePanel.setBorder(new TitledBorder(null, "Message", TitledBorder.LEADING, TitledBorder.TOP, null, null));
        messagePanel.setLayout(new BorderLayout(0, 0));
        messagePanel.add(messageScrollPane, BorderLayout.CENTER);

        JPanel userPanel = new JPanel();
        userPanel.setBorder(new TitledBorder(null, "Comment", TitledBorder.LEADING, TitledBorder.TOP, null, null));
        userPanel.setLayout(new BorderLayout(0, 0));

        // buttons panel
        reportButton = new JButton("Report");
        closeButton = new JButton("Close");

        JPanel buttonsPanel = new JPanel();
        buttonsPanel.add(reportButton);
        buttonsPanel.add(closeButton);

        // bottom
        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new BorderLayout(0, 0));

        bottomPanel.add(userPanel, BorderLayout.CENTER);

        JPanel commentPanel = new JPanel();
        userPanel.add(commentPanel, BorderLayout.CENTER);
        commentPanel.setLayout(new BorderLayout(0, 0));

        // comment pane
        commentTextPane = new JTextPane();
        commentTextPane.setEditable(true);

        final JScrollPane scComment = new JScrollPane(commentTextPane);
        commentPanel.add(scComment, BorderLayout.NORTH);
        scComment.setPreferredSize(new Dimension(23, 60));
        scComment.setMinimumSize(new Dimension(23, 60));

        JPanel emailPanel = new JPanel();
        userPanel.add(emailPanel, BorderLayout.SOUTH);
        GridBagLayout gbl_emailPanel = new GridBagLayout();
        gbl_emailPanel.columnWidths = new int[] {0, 0, 0};
        gbl_emailPanel.rowHeights = new int[] {0, 0};
        gbl_emailPanel.columnWeights = new double[] {0.0, 1.0, Double.MIN_VALUE};
        gbl_emailPanel.rowWeights = new double[] {0.0, Double.MIN_VALUE};
        emailPanel.setLayout(gbl_emailPanel);

        JLabel lblEmail = new JLabel("Your email");
        GridBagConstraints gbc_lblEmail = new GridBagConstraints();
        gbc_lblEmail.insets = new Insets(0, 0, 0, 5);
        gbc_lblEmail.anchor = GridBagConstraints.WEST;
        gbc_lblEmail.gridx = 0;
        gbc_lblEmail.gridy = 0;
        emailPanel.add(lblEmail, gbc_lblEmail);

        emailTextField = new IcyTextField();
        emailTextField.setToolTipText("You can enter your email so the developer can contact you if you wish");
        GridBagConstraints gbc_emailTextField = new GridBagConstraints();
        gbc_emailTextField.fill = GridBagConstraints.HORIZONTAL;
        gbc_emailTextField.gridx = 1;
        gbc_emailTextField.gridy = 0;
        emailPanel.add(emailTextField, gbc_emailTextField);
        emailTextField.setColumns(10);
        bottomPanel.add(buttonsPanel, BorderLayout.SOUTH);

        setLayout(new BorderLayout(0, 0));

        add(label, BorderLayout.NORTH);
        add(messagePanel, BorderLayout.CENTER);
        add(bottomPanel, BorderLayout.SOUTH);
    }

    /**
     * Returns formatted report message (ready to send to web site).
     * 
     * @throws BadLocationException
     */
    public String getReportMessage() throws BadLocationException
    {
        final String email = emailTextField.getText();
        final Document commentDoc = commentTextPane.getDocument();
        final Document errorDoc = errorMessageTextPane.getDocument();
        String comment = commentDoc.getText(0, commentDoc.getLength());
        String result = "";

        if (!StringUtil.isEmpty(email))
        {
            result += "Email: " + email + "\n";
            GeneralPreferences.setUserEmail(email);
        }
        if (!StringUtil.isEmpty(comment))
            result += "Comment:\n" + comment + "\n\n";

        result += errorDoc.getText(0, errorDoc.getLength());

        return result;
    }

}