/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.thingml.tradfri.ui;

import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import org.json.JSONException;
import org.thingml.tradfri.LightBulb;
import org.thingml.tradfri.TradfriConstants;
import org.thingml.tradfri.TradfriBulbListener;

/**
 *
 * @author franck
 */
public class BulbPanel extends javax.swing.JPanel implements TradfriBulbListener {

    protected LightBulb bulb;
    protected boolean updating = true;
    /**
     * Creates new form BulbPanel
     */
    public BulbPanel(LightBulb bulb) {
        this.bulb = bulb;
        bulb.addLightBulbListner(this);
        initComponents();
        updatePanelContent();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonGroupTemperature = new javax.swing.ButtonGroup();
        jToggleButton1 = new javax.swing.JToggleButton();
        jLabel1 = new javax.swing.JLabel();
        jSlider1 = new javax.swing.JSlider();
        jTextFieldName = new javax.swing.JTextField();
        jRadioCold = new javax.swing.JRadioButton();
        jRadioNormal = new javax.swing.JRadioButton();
        jRadioWarm = new javax.swing.JRadioButton();
        jLabel2 = new javax.swing.JLabel();
        jLabelDates = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();

        setMaximumSize(new java.awt.Dimension(32767, 89));
        setMinimumSize(new java.awt.Dimension(0, 89));

        jToggleButton1.setText("On / Off");
        jToggleButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButton1ActionPerformed(evt);
            }
        });

        jLabel1.setText("Intensity :");

        jSlider1.setMaximum(255);
        jSlider1.setMinimum(1);
        jSlider1.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                jSlider1StateChanged(evt);
            }
        });

        jTextFieldName.setEditable(false);
        jTextFieldName.setText("[Not Connected]");

        buttonGroupTemperature.add(jRadioCold);
        jRadioCold.setText("Cold");
        jRadioCold.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioColdActionPerformed(evt);
            }
        });

        buttonGroupTemperature.add(jRadioNormal);
        jRadioNormal.setText("Normal");
        jRadioNormal.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioNormalActionPerformed(evt);
            }
        });

        buttonGroupTemperature.add(jRadioWarm);
        jRadioWarm.setText("Warm");
        jRadioWarm.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioWarmActionPerformed(evt);
            }
        });

        jLabel2.setText("Name :");

        jLabelDates.setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
        jLabelDates.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabelDates.setText("Installed: Unknown - Last seen: Unknown - Firmware: Unknown");

        jButton1.setFont(new java.awt.Font("Dialog", 1, 10)); // NOI18N
        jButton1.setText("GET");
        jButton1.setMaximumSize(new java.awt.Dimension(56, 18));
        jButton1.setMinimumSize(new java.awt.Dimension(56, 18));
        jButton1.setPreferredSize(new java.awt.Dimension(56, 18));
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setFont(new java.awt.Font("Dialog", 1, 10)); // NOI18N
        jButton2.setText("SET");
        jButton2.setMaximumSize(new java.awt.Dimension(56, 18));
        jButton2.setMinimumSize(new java.awt.Dimension(56, 18));
        jButton2.setPreferredSize(new java.awt.Dimension(56, 18));
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jButton3.setText("Color");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel1)
                            .addComponent(jLabel2))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jSlider1, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jTextFieldName)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jButton3)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jRadioWarm)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jRadioNormal)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jRadioCold))))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelDates, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jToggleButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jToggleButton1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(11, 11, 11)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jRadioCold)
                        .addComponent(jRadioNormal)
                        .addComponent(jRadioWarm)
                        .addComponent(jTextFieldName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jButton3)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelDates)
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jToggleButton1ActionPerformed
        if (updating) return;
        bulb.setOn(jToggleButton1.isSelected());
    }//GEN-LAST:event_jToggleButton1ActionPerformed

    private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSlider1StateChanged
        if (updating) return;
        if (jSlider1.getValueIsAdjusting()) return;
        bulb.setIntensity(jSlider1.getValue());
    }//GEN-LAST:event_jSlider1StateChanged

    private void jRadioWarmActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioWarmActionPerformed
        if (updating) return;
        bulb.setColor(TradfriConstants.COLOR_WARM);
    }//GEN-LAST:event_jRadioWarmActionPerformed

    private void jRadioNormalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioNormalActionPerformed
        if (updating) return;
        bulb.setColor(TradfriConstants.COLOR_NORMAL);
    }//GEN-LAST:event_jRadioNormalActionPerformed

    private void jRadioColdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioColdActionPerformed
        if (updating) return;
        bulb.setColor(TradfriConstants.COLOR_COLD);
    }//GEN-LAST:event_jRadioColdActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        
        try {
            //JOptionPane pane = new JOptionPane();
            //pane.setMessageType(JOptionPane.INFORMATION_MESSAGE);
            JDialog dialog = new JDialog((Frame)null, "Result of COAP GET for bulb " + bulb.getName(), false);
            JTextArea msg = new JTextArea(bulb.getJsonObject().toString(4) + "\n");
            msg.setFont(new Font("monospaced", Font.PLAIN, 10));
            msg.setLineWrap(true);
            msg.setWrapStyleWord(true);
            JScrollPane scrollPane = new JScrollPane(msg);
            
            dialog.getContentPane().add(scrollPane);
            dialog.setSize(350, 350);
            //dialog.pack();
            dialog.setVisible(true);
            
            
        } catch (JSONException ex) {
            Logger.getLogger(BulbPanel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//GEN-LAST:event_jButton1ActionPerformed

    protected String previous_put = "";
    
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed

        String put = JOptionPane.showInputDialog(this, "JSON to SET for bulb " + bulb.getName(), previous_put);
        if (put != null) {
            previous_put = put;
            bulb.sendJSONPayload(put);
        }
        
    }//GEN-LAST:event_jButton2ActionPerformed

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
        Color c = JColorChooser.showDialog(null, "Choose a color", Color.WHITE);
        if (c != null) {
            bulb.setRGBColor(c.getRed(), c.getGreen(), c.getBlue());
        }
    }//GEN-LAST:event_jButton3ActionPerformed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.ButtonGroup buttonGroupTemperature;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabelDates;
    private javax.swing.JRadioButton jRadioCold;
    private javax.swing.JRadioButton jRadioNormal;
    private javax.swing.JRadioButton jRadioWarm;
    private javax.swing.JSlider jSlider1;
    private javax.swing.JTextField jTextFieldName;
    private javax.swing.JToggleButton jToggleButton1;
    // End of variables declaration//GEN-END:variables

    protected void updatePanelContent() {
        updating = true;
        jTextFieldName.setText(bulb.getName());
        jTextFieldName.setToolTipText(bulb.getType());
        jSlider1.setValue(bulb.getIntensity());
        jToggleButton1.setSelected(bulb.isOn());
        if (bulb.getColor() != null) {
            jRadioCold.setEnabled(true);
            jRadioNormal.setEnabled(true);
            jRadioWarm.setEnabled(true);
            switch(bulb.getColor()) {
                case TradfriConstants.COLOR_NORMAL: jRadioNormal.setSelected(true); break;
                case TradfriConstants.COLOR_WARM: jRadioWarm.setSelected(true); break;
                case TradfriConstants.COLOR_COLD: jRadioCold.setSelected(true); break;
            }
        }
        else {
            jRadioCold.setEnabled(false);
            jRadioNormal.setEnabled(false);
            jRadioWarm.setEnabled(false);
        }
        
        
        if (bulb.isOnline()) {
            jToggleButton1.setEnabled(true);
            jRadioCold.setEnabled(true);
            jRadioNormal.setEnabled(true);
            jRadioWarm.setEnabled(true);
            jSlider1.setEnabled(true);
            jLabelDates.setText("Installed: "+bulb.getDateInstalled()+" - Last seen: "+bulb.getDateLastSeen()+" - Firmware: " + bulb.getFirmware() + " [online]");
        }
        else {
            jToggleButton1.setEnabled(false);
            jRadioCold.setEnabled(false);
            jRadioNormal.setEnabled(false);
            jRadioWarm.setEnabled(false);
            jSlider1.setEnabled(false);
            jLabelDates.setText("Installed: "+bulb.getDateInstalled()+" - Last seen: "+bulb.getDateLastSeen()+" - Firmware: " + bulb.getFirmware() + " [offline]");
        }
        
        updating = false;
    }
    
    public void bulb_state_changed(LightBulb bulb) {
        if (this.bulb == bulb)  updatePanelContent();
    }
}