/*
 * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Copyright @ 2015 Atlassian Pty Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.java.sip.communicator.impl.gui.main.chat.conference;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;

import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.plugin.desktoputil.SwingWorker;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.skin.*;

/**
 * The dialog that pops up when a chat room invitation is received.
 *
 * @author Yana Stamcheva
 * @author Valentin Martinet
 * @author Adam Netocny
 */
public class InvitationReceivedDialog
    extends SIPCommDialog
    implements  ActionListener,
                Skinnable
{
    private final JTextArea infoTextArea = new JTextArea();

    private final JTextArea invitationReasonTextArea = new JTextArea();

    private final JPanel reasonPanel = new JPanel(new BorderLayout());

    private final JLabel reasonLabel = new JLabel(
        GuiActivator.getResources().getI18NString("service.gui.REASON") + ": ");

    private final JTextField reasonField = new JTextField();

    private final JPanel dataPanel = new JPanel(new BorderLayout(10, 10));

    private final JPanel buttonsPanel
        = new JPanel(new FlowLayout(FlowLayout.RIGHT));

    private final JButton acceptButton = new JButton(
        GuiActivator.getResources().getI18NString("service.gui.ACCEPT"));

    private final JButton rejectButton = new JButton(
        GuiActivator.getResources().getI18NString("service.gui.REJECT"));

    private final JButton ignoreButton = new JButton(
        GuiActivator.getResources().getI18NString("service.gui.IGNORE"));

    private final JPanel mainPanel = new JPanel(new BorderLayout(10, 10));

    private final JPanel northPanel = new JPanel(new BorderLayout(10, 10));

    private final JLabel iconLabel = new JLabel(new ImageIcon(
            ImageLoader.getImage(ImageLoader.INVITE_DIALOG_ICON)));

    private final String title = GuiActivator.getResources()
        .getI18NString("service.gui.INVITATION_RECEIVED");

    /**
     * The <tt>ChatRoomInvitation</tt> for which this dialog is.
     */
    private ChatRoomInvitation invitation = null;;

    /**
     * The <tt>AdHocChatRoomInvitation</tt> for which this dialog is, in case of
     * an <tt>AdHocChatRoom</tt>.
     */
    private AdHocChatRoomInvitation invitationAdHoc = null;

    /**
     * The <tt>MultiUserChatManager</tt> is the one that deals with invitation
     * events.
     */
    private final ConferenceChatManager multiUserChatManager;

    /**
     * The operation set that would handle the rejection if the user choose to
     * reject the invitation.
     */
    private OperationSetMultiUserChat multiUserChatOpSet = null;;

    /**
     * The operation set that would handle the rejection if the user choose to
     * reject the invitation, in case of an <tt>AdHocChatRoom</tt>.
     */
    private OperationSetAdHocMultiUserChat multiUserChatAdHocOpSet = null;;

    /**
     * Constructs the <tt>ChatInviteDialog</tt>.
     *
     * @param multiUserChatManager the <tt>MultiUserChatManager</tt> is the one
     * that deals with invitation events
     * @param multiUserChatOpSet the operation set that would handle the
     * rejection if the user choose to reject the invitation
     * @param invitation the invitation that this dialog represents
     */
    public InvitationReceivedDialog (ConferenceChatManager multiUserChatManager,
            OperationSetMultiUserChat multiUserChatOpSet,
            ChatRoomInvitation invitation)
    {
        super(GuiActivator.getUIService().getMainFrame());

        this.multiUserChatManager = multiUserChatManager;

        this.multiUserChatOpSet = multiUserChatOpSet;

        this.invitation = invitation;

        this.setModal(false);

        this.setTitle(title);

        this.mainPanel.setPreferredSize(new Dimension(400, 230));

//        this.mainPanel.setOpaque(false);

        infoTextArea.setText(
            GuiActivator.getResources().getI18NString(
                "service.gui.INVITATION_RECEIVED_MSG",
                new String[] {  invitation.getInviter(),
                                invitation.getTargetChatRoom().getName()}));

        if(invitation.getReason() != null && invitation.getReason().length() > 0)
        {
            this.invitationReasonTextArea.setLineWrap(true);
            this.invitationReasonTextArea.setWrapStyleWord(true);
            this.invitationReasonTextArea.setOpaque(false);
            this.invitationReasonTextArea.setEditable(false);

            TitledBorder border =
                BorderFactory.createTitledBorder(
                    GuiActivator.getResources()
                        .getI18NString("service.gui.INVITATION"));
            border.setTitleFont(border.getTitleFont().deriveFont(Font.BOLD));
            invitationReasonTextArea.setBorder(border);

            invitationReasonTextArea.setText(invitation.getReason());

            this.dataPanel.add(invitationReasonTextArea, BorderLayout.CENTER);
        }

        this.initGUI();
    }

    /**
     * Constructs the <tt>ChatInviteDialog</tt>, in case of an
     * <tt>AdHocChatRoom</tt>.
     *
     * @param multiUserChatManager the <tt>MultiUserChatManager</tt> is the one
     * that deals with invitation events
     * @param multiUserChatAdHocOpSet the operation set that would handle the
     * rejection if the user choose to reject the invitation
     * @param invitationAdHoc the invitation that this dialog represents
     */
    public InvitationReceivedDialog (ConferenceChatManager multiUserChatManager,
            OperationSetAdHocMultiUserChat multiUserChatAdHocOpSet,
            AdHocChatRoomInvitation invitationAdHoc)
    {
        super(GuiActivator.getUIService().getMainFrame());

        this.multiUserChatManager = multiUserChatManager;

        this.multiUserChatAdHocOpSet = multiUserChatAdHocOpSet;

        this.invitationAdHoc = invitationAdHoc;

        this.setModal(false);

        this.setTitle(title);

        this.mainPanel.setPreferredSize(new Dimension(400, 230));

//        this.mainPanel.setOpaque(false);

        infoTextArea.setText(
            GuiActivator.getResources().getI18NString(
                "service.gui.INVITATION_RECEIVED_MSG",
                new String[] {
                    invitationAdHoc.getInviter(),
                    invitationAdHoc.getTargetAdHocChatRoom().getName()}));

        if(invitationAdHoc.getReason() != null
                && !invitationAdHoc.getReason().equals(""))
        {
            invitationReasonTextArea.setText(invitationAdHoc.getReason());
            invitationReasonTextArea.setBorder(
                BorderFactory.createTitledBorder(
                    GuiActivator.getResources()
                        .getI18NString("service.gui.INVITATION")));

            this.dataPanel.add(invitationReasonTextArea, BorderLayout.CENTER);
        }

        this.initGUI();
    }

    /**
     * Initializes and builds the GUI.
     */
    public void initGUI()
    {
        this.infoTextArea.setFont(infoTextArea.getFont().deriveFont(Font.BOLD));
        this.infoTextArea.setLineWrap(true);
        this.infoTextArea.setOpaque(false);
        this.infoTextArea.setWrapStyleWord(true);
        this.infoTextArea.setEditable(false);

        this.northPanel.add(iconLabel, BorderLayout.WEST);
        this.northPanel.add(infoTextArea, BorderLayout.CENTER);
        this.northPanel.setOpaque(false);

        this.reasonPanel.add(reasonLabel, BorderLayout.WEST);
        this.reasonPanel.add(reasonField, BorderLayout.CENTER);
        this.reasonPanel.setOpaque(false);

        this.dataPanel.add(reasonPanel, BorderLayout.SOUTH);
        this.dataPanel.setOpaque(false);

        this.acceptButton.addActionListener(this);
        this.rejectButton.addActionListener(this);
        this.ignoreButton.addActionListener(this);

        this.buttonsPanel.add(acceptButton);
        this.buttonsPanel.add(rejectButton);
        this.buttonsPanel.add(ignoreButton);
        this.buttonsPanel.setOpaque(false);

        this.getRootPane().setDefaultButton(acceptButton);
        this.acceptButton.setMnemonic(
            GuiActivator.getResources().getI18nMnemonic("service.gui.ACCEPT"));
        this.rejectButton.setMnemonic(
            GuiActivator.getResources().getI18nMnemonic("service.gui.REJECT"));
        this.ignoreButton.setMnemonic(
            GuiActivator.getResources().getI18nMnemonic("service.gui.IGNORE"));

        this.mainPanel.setBorder(
            BorderFactory.createEmptyBorder(15, 15, 15, 15));

        this.mainPanel.add(northPanel, BorderLayout.NORTH);
        this.mainPanel.add(dataPanel, BorderLayout.CENTER);
        this.mainPanel.add(buttonsPanel, BorderLayout.SOUTH);
        this.mainPanel.setOpaque(false);

        this.getContentPane().add(mainPanel);
        this.pack();
    }

    /**
     * Handles the <tt>ActionEvent</tt> triggered when one user clicks
     * on one of the buttons.
     * @param e the event.
     */
    public void actionPerformed(ActionEvent e)
    {
        JButton button = (JButton)e.getSource();

        if (button.equals(acceptButton))
        {
            if(invitationAdHoc == null)
                GuiActivator.getMUCService().acceptInvitation(invitation);
            else
                try
                {
                    multiUserChatManager.acceptInvitation(
                            invitationAdHoc, multiUserChatAdHocOpSet);
                } catch (OperationFailedException e1)
                {
                    e1.printStackTrace();
                }
        }
        else if (button.equals(rejectButton))
        {
            if(multiUserChatAdHocOpSet == null && invitationAdHoc == null)
                try
                {
                    GuiActivator.getMUCService().rejectInvitation(
                        multiUserChatOpSet, invitation, reasonField.getText());
                }
                catch (OperationFailedException e1)
                {
                    SwingUtilities.invokeLater(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            MessageDialog md = new MessageDialog(
                                null,
                                "Failed to reject invitation",
                                "Failed to reject the invitation",
                                false);
                            md.setVisible(true);
                        }
                    });
                }
            else
                multiUserChatManager.rejectInvitation(multiUserChatAdHocOpSet,
                        invitationAdHoc, reasonField.getText());
        }

        this.dispose();
    }

    /**
     * Disposes this dialog when it's closed.
     *
     * @param isEscaped indicates if the dialog was close by pressing the Esc
     * key
     */
    @Override
    protected void close(boolean isEscaped)
    {
        this.dispose();
    }

    /**
     * Reloads icon label.
     */
    public void loadSkin()
    {
        iconLabel.setIcon(new ImageIcon(
                ImageLoader.getImage(ImageLoader.INVITE_DIALOG_ICON)));
    }
}
