/**
 * 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.plugin.desktoputil.chat;

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

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

import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;

/**
 * Dialog with fields for nickname and subject.
 *
 * @author Hristo Terezov
 */
public class ChatRoomJoinOptionsDialog extends ChatOperationReasonDialog
{
    /**
     * Serial id.
     */
    private static final long serialVersionUID = -916498752420264164L;

    /** 
     * Text field for the subject.
     */
    private SIPCommTextField subject = new SIPCommTextField(DesktopUtilActivator
        .getResources().getI18NString("service.gui.SUBJECT"));
    
    /**
     * Label that hides and shows the subject fields panel on click.
     */
    private JLabel cmdExpandSubjectFields;
    
    /**
     * Panel that holds the subject fields.
     */
    private JPanel subjectFieldsPannel = new JPanel(new BorderLayout());
    
    /**
     * Adds the subject fields to dialog. Sets action listeners.
     * 
     * @param title the title of the dialog
     * @param message the message shown in this dialog
     * @param disableOKIfReasonIsEmpty if true the OK button will be 
     * disabled if the reason text is empty.
     * @param showReasonLabel specify if we want the "Reason:" label
     * @param dontDisplaySubjectFields if true the sibject fields will be 
     * hidden.
     */
    public ChatRoomJoinOptionsDialog(String title, String message,
        boolean showReasonLabel,
        boolean disableOKIfReasonIsEmpty,
        boolean dontDisplaySubjectFields)
    {
        super(title,
            message,
            showReasonLabel,
            disableOKIfReasonIsEmpty);
        
        if(dontDisplaySubjectFields)
            return;
        
        JPanel subjectPanel = new JPanel(new BorderLayout());
        subjectPanel.setOpaque(false);
        subjectPanel.setBorder(
            BorderFactory.createEmptyBorder(10, 0, 0, 0));
        
        subjectFieldsPannel.setBorder(
            BorderFactory.createEmptyBorder(10, 30, 0, 0));
        subjectFieldsPannel.setOpaque(false);
        subjectFieldsPannel.add(subject, BorderLayout.CENTER);
        subjectFieldsPannel.setVisible(false);
        subject.setFont(getFont().deriveFont(12f));
        
        cmdExpandSubjectFields = new JLabel();
        cmdExpandSubjectFields.setBorder(new EmptyBorder(0, 5, 0, 0));
        cmdExpandSubjectFields.setIcon(DesktopUtilActivator.getResources()
            .getImage("service.gui.icons.RIGHT_ARROW_ICON"));
        cmdExpandSubjectFields.setText(DesktopUtilActivator
            .getResources().getI18NString("service.gui.SET_SUBJECT"));
        cmdExpandSubjectFields.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                cmdExpandSubjectFields.setIcon(
                        UtilActivator.getResources().getImage(
                            subjectFieldsPannel.isVisible()
                                    ? "service.gui.icons.RIGHT_ARROW_ICON"
                                    : "service.gui.icons.DOWN_ARROW_ICON"));

                subjectFieldsPannel.setVisible(
                    !subjectFieldsPannel.isVisible());

                pack();
            }
        });
        subjectPanel.add(cmdExpandSubjectFields,BorderLayout.NORTH);
        subjectPanel.add(subjectFieldsPannel,BorderLayout.CENTER);
        addToReasonFieldPannel(subjectPanel);
        this.pack();
    }

   /**
    * Returns the text entered in the subject field.
    * 
    * @return the text from the subject field.
    */
   public String getSubject()
   {
       return subject.getText();
   }
   
   /**
    * Opens a dialog with a fields for the nickname and the subject of the room
    *  and returns them.
    *
    * @param pps the protocol provider associated with the chat room.
    * @param chatRoomId the id of the chat room.
    * @param defaultNickname the nickname to show if any
    * @return array with the nickname and subject values.
    */
   public static String[] getJoinOptions(ProtocolProviderService pps, 
       String chatRoomId, String defaultNickname)
   {
       return getJoinOptions(false, pps, chatRoomId, defaultNickname);
   }

   /**
    * Opens a dialog with a fields for the nickname and the subject of the room
    *  and returns them.
    *
    * @param dontDisplaySubjectFields if true the subject fields will be hidden
    * @param pps the protocol provider associated with the chat room.
    * @param chatRoomId the id of the chat room.
    * @param defaultNickname the nickname to show if any
    * @return array with the nickname and subject values.
    */
   public static String[] getJoinOptions(boolean dontDisplaySubjectFields,
       ProtocolProviderService pps, String chatRoomId, String defaultNickname)
   {
       String nickName = null;
       ChatRoomJoinOptionsDialog reasonDialog =
           new ChatRoomJoinOptionsDialog(DesktopUtilActivator.getResources()
               .getI18NString("service.gui.CHANGE_NICKNAME"), 
               DesktopUtilActivator.getResources().getI18NString(
                   "service.gui.CHANGE_NICKNAME_LABEL"), false, true, 
                   dontDisplaySubjectFields);
       reasonDialog.setIcon(new ImageIcon(DesktopUtilActivator.getImage(
           "service.gui.icons.CHANGE_NICKNAME_16x16")));

       if(defaultNickname != null)
            reasonDialog.setReasonFieldText(defaultNickname);
       
       int result = reasonDialog.showDialog();

       if (result == MessageDialog.OK_RETURN_CODE)
       {
           nickName = reasonDialog.getReason().trim();
           ConfigurationUtils.updateChatRoomProperty(
               pps,
               chatRoomId, "userNickName", nickName);
           
       }
       String[] joinOptions = {nickName, reasonDialog.getSubject()};
       return joinOptions;
   }
   
}
