
package tmcsim.cadsimulator.viewer;

import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.Properties;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * ConfigStatusPanel displays the content of configuration files.
 * A ComboBox allows the user to select from a list of current properties files.
 *
 * @author Drew Miller
 * @author jdalbey
 */
public class ConfigStatusTab extends javax.swing.JPanel
{
    /**
     * Properties file for the CAD Server.
     */
    private Properties cadServerProperties;

    /**
     * Creates new form 
     */
    public ConfigStatusTab(String propertiesFile)
    {
        initComponents();
        createMenu(propertiesFile);
        addMenuListener();
        setupTextView();
    }
    /** Add the properties filenames to the combobox menu */
    private void createMenu(String propertiesFile)
    {
        selectMenu.addItem(propertiesFile);
        try {
            cadServerProperties = new Properties();
            cadServerProperties.load(new FileInputStream(propertiesFile));
            // Add each item that's a properties file to the menu
            for (String propname: cadServerProperties.stringPropertyNames())
            {
                String currVal = (String) cadServerProperties.get(propname);
                if (currVal.endsWith(".properties"))
                {
                    selectMenu.addItem(currVal);
                }
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ConfigStatusTab.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ConfigStatusTab.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }

    /** Determine complete path to file, given the filename */
    private Path getPathToFile(String fileName)
    {
        return FileSystems.getDefault().getPath(fileName);
    }
    /** Return the text from the given file */
    private String getFileContent(Path pathToFile) 
    {
        FileInputStream fis = null;
        try
        {
            //Read a file into a single string.
            fis = new FileInputStream(pathToFile.toString());
            Scanner s = new Scanner(fis).useDelimiter("\\A");
            return s.next();
        }
        catch (FileNotFoundException ex)
        {
            return "Error: config file not found.";
        }
    }
    /** Refresh the display using the given properties file path */
    private void updateDisplay(Path pathToFileName)
    {
        view.setText(getFileContent(pathToFileName));
        view.setCaretPosition(view.getDocument().getLength());
    }

    /** Add menu listener to the Combo Box */
    private void addMenuListener()
    {
        selectMenu.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                // Find which menu item was clicked
                JComboBox src = (JComboBox) e.getSource();
                // Get the menu item string 
                String menuItem = src.getSelectedItem().toString();
                // Get the path to that file
                Path p = getPathToFile(menuItem);
                // Display the contents of that file
                updateDisplay(p);
            }
        });
    }

    private void setupTextView()
    {
        view.setEditable(false);
        view.setLineWrap(true);
        view.setWrapStyleWord(true);
        // Initially display the first config file in list
        Path path = getPathToFile(selectMenu.getItemAt(0));
        view.setText(getFileContent(path));
    }

     /**
     * Local main for unit testing. 
     *
     * @param args not used
     */
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Config Status Panel Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1050, 450);
        ConfigStatusTab pnl = new ConfigStatusTab("config/cad_simulator_config.properties");
        frame.add(pnl);
        frame.setVisible(true);
    }
    /**
     * 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() {

        selectMenu = new javax.swing.JComboBox<>();
        jScrollPane1 = new javax.swing.JScrollPane();
        view = new javax.swing.JTextArea();

        setLayout(new java.awt.BorderLayout());
        add(selectMenu, java.awt.BorderLayout.PAGE_START);

        view.setColumns(20);
        view.setFont(new java.awt.Font("Courier New", 0, 15)); // NOI18N
        view.setRows(5);
        jScrollPane1.setViewportView(view);

        add(jScrollPane1, java.awt.BorderLayout.CENTER);
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JComboBox<String> selectMenu;
    private javax.swing.JTextArea view;
    // End of variables declaration//GEN-END:variables
}
