/** @file

 Copyright (c) 2006, Intel Corporation
 All rights reserved. This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD License
 which accompanies this distribution.  The full text of the license may be found at
 http://opensource.org/licenses/bsd-license.php
 
 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 
 **/

package org.tianocore.frameworkwizard.far.installui;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.List;
import java.util.jar.JarFile;
import java.util.Iterator;

import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JTextArea;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;

import org.tianocore.frameworkwizard.common.DataType;
import org.tianocore.frameworkwizard.common.IFileFilter;
import org.tianocore.frameworkwizard.common.Log;
import org.tianocore.frameworkwizard.common.Tools;
import org.tianocore.frameworkwizard.common.ui.IDialog;
import org.tianocore.frameworkwizard.common.ui.IFrame;
import org.tianocore.frameworkwizard.far.DistributeRule;
import org.tianocore.frameworkwizard.far.Far;
import org.tianocore.frameworkwizard.far.FarStringDefinition;
import org.tianocore.frameworkwizard.packaging.PackageIdentification;
import org.tianocore.frameworkwizard.workspace.Workspace;

import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class InstallStepOne extends IDialog implements MouseListener {

    /**
     * 
     */
    private static final long serialVersionUID = -8821906198791949544L;

    private JPanel jContentPane = null;

    private JButton jButtonCancel = null;

    private JButton jButtonNext = null;

    private JTextArea jTextArea = null;

    private JLabel jLabel = null;

    private JTextField jTextFieldFarFile = null;

    private JButton jButtonBrowser = null;

    private InstallStepTwo stepTwo = null;

    Far far = null;

    private JLabel jLabelWarning = null;

    private JScrollPane jScrollPane = null;

    private JTable jTable = null;

    private PartialTableModel model = null;

    /**
     * This method initializes jButtonCancel	
     * 	
     * @return javax.swing.JButton	
     */
    private JButton getJButtonCancel() {
        if (jButtonCancel == null) {
            jButtonCancel = new JButton();
            jButtonCancel.setBounds(new java.awt.Rectangle(570, 330, 90, 20));
            jButtonCancel.setText("Cancel");
            jButtonCancel.addMouseListener(this);
        }
        return jButtonCancel;
    }

    /**
     * This method initializes jButtonNext	
     * 	
     * @return javax.swing.JButton	
     */
    private JButton getJButtonNext() {
        if (jButtonNext == null) {
            jButtonNext = new JButton();
            jButtonNext.setBounds(new java.awt.Rectangle(470, 330, 90, 20));
            jButtonNext.setText("Next");
            jButtonNext.addMouseListener(this);
        }
        return jButtonNext;
    }

    /**
     * This method initializes jTextArea	
     * 	
     * @return javax.swing.JTextArea	
     */
    private JTextArea getJTextArea() {
        if (jTextArea == null) {
            jTextArea = new JTextArea();
            jTextArea.setBounds(new java.awt.Rectangle(30, 7, 642, 50));
            jTextArea.setText("Step 1: Choose a framework archive(FAR) file. \n");
            jTextArea.setEditable(false);
        }
        return jTextArea;
    }

    /**
     * This method initializes jTextField	
     * 	
     * @return javax.swing.JTextField	
     */
    private JTextField getJTextFieldFarFile() {
        if (jTextFieldFarFile == null) {
            jTextFieldFarFile = new JTextField();
            jTextFieldFarFile.setBounds(new java.awt.Rectangle(140, 80, 423, 20));
        }
        return jTextFieldFarFile;
    }

    /**
     * This method initializes jButtonBrowser	
     * 	
     * @return javax.swing.JButton	
     */
    private JButton getJButtonBrowser() {
        if (jButtonBrowser == null) {
            jButtonBrowser = new JButton();
            jButtonBrowser.setBounds(new java.awt.Rectangle(570, 80, 100, 20));
            jButtonBrowser.setText("Browser...");
            jButtonBrowser.addMouseListener(this);
        }
        return jButtonBrowser;
    }

    /**
     * This method initializes jScrollPane	
     * 	
     * @return javax.swing.JScrollPane	
     */
    private JScrollPane getJScrollPane() {
        if (jScrollPane == null) {
            jScrollPane = new JScrollPane();
            jScrollPane.setBounds(new java.awt.Rectangle(30, 165, 642, 140));
            jScrollPane.setViewportView(getJTable());
        }
        jScrollPane.setVisible(false);
        return jScrollPane;
    }

    /**
     * This method initializes jTable	
     * 	
     * @return javax.swing.JTable	
     */
    private JTable getJTable() {
        if (jTable == null) {
            jTable = new JTable();
            model = new PartialTableModel();
            jTable = new JTable(model);
            jTable.setRowHeight(20);
            jTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
            model.addColumn("Name");
            model.addColumn("Version");
            model.addColumn("GUID");

            jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        }
        jTable.setVisible(false);
        return jTable;
    }

    public void prepareTable(List<PackageIdentification> packageList) {
        model.setRowCount(0);
        //
        // Change here to get packages and platforms from FAR
        //
        Iterator<PackageIdentification> iter = packageList.iterator();
        while (iter.hasNext()) {
            String[] str = new String[3];
            PackageIdentification item = iter.next();
            str[0] = item.getName();
            str[1] = item.getVersion();
            str[2] = item.getGuid();
            model.addRow(str);
        }
    }

    /**
     * This is the default constructor
     */
    public InstallStepOne(IFrame iFrame, boolean modal) {
        super(iFrame, modal);
        initialize();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(700, 400);
        this.setContentPane(getJContentPane());
        this.setTitle(FarStringDefinition.INSTALL_STEP_ONE_TITLE);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        this.setLocation((d.width - this.getSize().width) / 2, (d.height - this.getSize().height) / 2);
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jLabelWarning = new JLabel();
            jLabelWarning.setBounds(new java.awt.Rectangle(30, 125, 510, 20));
            jLabelWarning.setText("Cannot install this FAR, the WORKSPACE is missing the following required packages.");
            jLabelWarning.setVisible(false);
            jLabel = new JLabel();
            jLabel.setBounds(new java.awt.Rectangle(30, 80, 97, 20));
            jLabel.setText("Choose FAR file: ");
            jContentPane = new JPanel();
            jContentPane.setLayout(null);
            jContentPane.add(getJButtonCancel(), null);
            jContentPane.add(getJButtonNext(), null);
            jContentPane.add(getJTextArea(), null);
            jContentPane.add(jLabel, null);
            jContentPane.add(getJTextFieldFarFile(), null);
            jContentPane.add(getJButtonBrowser(), null);
            jContentPane.add(jLabelWarning, null);
            jContentPane.add(getJScrollPane(), null);
        }
        return jContentPane;
    }

    public void mouseClicked(MouseEvent e) {
        if (e.getSource() == jButtonCancel) {
            this.setVisible(false);
        } else if (e.getSource() == jButtonNext) {
            //
            // Add some logic process here
            //
            File farFile = new File(jTextFieldFarFile.getText());
            if (!farFile.exists() || !farFile.isFile()) {
                Log.wrn("Install far", "Please choose an existing FAR file.");
                return;
            }

            //
            // Verify Far
            //
            JarFile jarFar;
            try {
                jarFar = new JarFile(farFile);
                far = new Far(jarFar);

                //
                // Far dependency check
                //
                List<PackageIdentification> pkgIdList = DistributeRule.installFarCheck(far);

                if (pkgIdList.size() > 0) {
                    prepareTable(pkgIdList);
                    jLabelWarning.setVisible(true);
                    jTable.setVisible(true);
                    jScrollPane.setVisible(true);
                    return;
                }

            } catch (Exception exp) {
                Log.wrn("Install far" + exp.getMessage());
                Log.err("Install far" + exp.getMessage());
            }

            if (stepTwo == null) {
                stepTwo = new InstallStepTwo(this, true, this);
            }
            this.setVisible(false);

            //
            // Refresh table
            //
            stepTwo.preparePackageTable();
            stepTwo.preparePlatformTable();
            stepTwo.setVisible(true);
        } else if (e.getSource() == jButtonBrowser) {
            JFileChooser fc = new JFileChooser();
            fc.setAcceptAllFileFilterUsed(false);
            fc.addChoosableFileFilter(new IFileFilter(DataType.FAR_SURFACE_AREA_EXT));
            fc.setCurrentDirectory(new File(Workspace.getCurrentWorkspace()));

            int result = fc.showOpenDialog(new JPanel());
            if (result == JFileChooser.APPROVE_OPTION) {
                jLabelWarning.setVisible(false);
                jTable.setVisible(false);
                jScrollPane.setVisible(false);
                this.jTextFieldFarFile.setText(Tools.addPathExt(fc.getSelectedFile().getPath(),
                                                                DataType.RETURN_TYPE_FAR_SURFACE_AREA));
            }
        }
    }

    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public Far getFar() {
        return far;
    }

}

class PartialTableModel extends DefaultTableModel {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public boolean isCellEditable(int row, int col) {
        switch (col) {
        default:
            return false;
        }
    }
}
