/*
 * Licensed Materials - Property of Rogue Wave Software, Inc. 
 * © Copyright Rogue Wave Software, Inc. 2014, 2015 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */

package plugins;

import ilog.views.IlvManagerView;
import ilog.views.maps.IlvMapUtil;
import ilog.views.maps.beans.IlvFeatureSelectorPanel;
import ilog.views.maps.datasource.IlvHierarchicalDataSource;
import ilog.views.maps.datasource.IlvMapDataSource;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.security.AccessControlException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import nodefense.VMAPDefLess;

/**
 * Class that manages VMAP import action.
 */
public class VMAPLoadAction extends ImportAction {

  IlvFeatureSelectorPanel featurePanel;
  JPanel compositePanel;
  TilingParameterPanel tilingPanel;
  boolean isLibrary = false;
  float lonMin = -180;
  float lonMax = 180;
  float latMin = -90;
  float latMax = 90;

  /**
   * Creates an action for the specified view
   * @param view view to add map data to.
   */
  public VMAPLoadAction(IlvManagerView view) {
    super(view);
  }

  /**
   * @see plugins.ImportAction#getSubDirectory()
   */
  protected String getSubDirectory() {
    return IlvMapUtil.getString(getClass(), "VMAPLoadAction.CDDirectory"); //$NON-NLS-1$
  }

  /**
   * @see plugins.ImportAction#selectedFileChanged(java.io.File)
   */
  public void selectedFileChanged(File file) {
    isLibrary = isVMAPDirectory(file);
    setEnabledComponent(compositePanel, isLibrary);
    setEnabledComponent(featurePanel, isLibrary);
  }

  /**
   * @see plugins.ImportAction#directoryChanged(java.io.File)
   */
  public void directoryChanged(File file) {
    selectedFileChanged(file);
  }

  /**
   * Convenience method to disable compound compoments.
   *
   * @param c the component to disable
   * @param enabled is the component enabled
   *
   */

  private void setEnabledComponent(JComponent c, boolean enabled) {
    Component[] compArray;
    if (c == null)
      return;
    compArray = c.getComponents();
    for (int i = 0; i < compArray.length; i++) {
      if (compArray[i] instanceof JComponent) {

        //                              else {
        ((JComponent) compArray[i]).setEnabled(enabled);
        if (compArray[i] instanceof JButton && !enabled) {
          ((AbstractButton) compArray[i]).setBackground(c.getBackground());
        }
        if (compArray[i] instanceof Container) {
          // Recurse
          setEnabledComponent((JComponent) compArray[i], enabled);
        }
        //                              }
      }
    }
  }

  /**
   * Checks if a directory can be a VMAP directory.
   * @param f directory
   * @return true if the directory could be a VMAP directory.
   */
  public boolean isVMAPDirectory(File f) {
    if (f == null)
      return false;
    String databasePath = f.getParent();
    String libraryName = f.getName();
    //      IlvVMAPReader dummyReader = new IlvVMAPReader(databasePath);
    Object dummyReader = VMAPDefLess.newIlvVMAPReader(databasePath);
    //          dummyReader.setLibraryName(libraryName);
    VMAPDefLess.setLibraryName(dummyReader, libraryName);
    String LATPath = databasePath + "/lat";//$NON-NLS-1$
    try {
      //                        IlvVMAPTable libraryAttributeTable = dummyReader.getVMAPTable(LATPath, true);
      Object libraryAttributeTable = VMAPDefLess.getVMAPTable(dummyReader, LATPath, true);
      if (libraryAttributeTable==null) {
        return false;
      }      //            int currentLATRecordIndex = libraryAttributeTable.searchRecordByColumnValue(1, libraryName.toLowerCase());
      int currentLATRecordIndex = VMAPDefLess.searchRecordByColumnValue(libraryAttributeTable, 1, libraryName.toLowerCase());
      if (currentLATRecordIndex==-1) {
        return false;
      }
      //                        libraryAttributeTable.getRecord(currentLATRecordIndex);
      //          Object[] currentLATRecord = libraryAttributeTable.getRecord(currentLATRecordIndex);
      Object[] currentLATRecord = VMAPDefLess.getRecord(libraryAttributeTable, currentLATRecordIndex);

      // get library bounds
      lonMin = ((Float) currentLATRecord[2]).floatValue();
      latMin = ((Float) currentLATRecord[3]).floatValue();
      lonMax = ((Float) currentLATRecord[4]).floatValue();
      latMax = ((Float) currentLATRecord[5]).floatValue();
      //          libraryAttributeTable.closeVMAPDataInput();
      VMAPDefLess.closeVMAPDataInput(libraryAttributeTable);
    } catch (Exception e1) {
      return false;
    }
    return true;
  }

  /** return false.
   * @see plugins.ImportAction#isMultiSelectionEnabled()
   */
  public boolean isMultiSelectionEnabled() {
    return false;
  }

  /** return DIRECTORIES_ONLY
   * @see plugins.ImportAction#getSelectionMode()
   */
  public int getSelectionMode() {
    return JFileChooser.DIRECTORIES_ONLY;
  }

  /**
   * @see plugins.ImportAction#getAccessory()
   */
  public JComponent getAccessory() {
    String filename = "VMAPFeaturesEN.xml"; //$NON-NLS-1$
    if (featurePanel == null) {
      featurePanel = new IlvFeatureSelectorPanel(null, filename,"VMAP");//$NON-NLS-1$
      //                JScrollPane sp = new JScrollPane(featurePanel);
      // IlvDisplayPreferences prefs = IlvDisplayPreferencesProperty.GetDisplayPreferences(getView().getManager());
      compositePanel = new JPanel(new BorderLayout());
      compositePanel.add(new JScrollPane(featurePanel), BorderLayout.CENTER);
      tilingPanel = new TilingParameterPanel(getView(), true);
      JButton boundsButton = new JButton(IlvMapUtil.getString(getClass(), "VMAPLoadAction.getBounds")); //$NON-NLS-1$
      boundsButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          tilingPanel.setBounds(Math.toRadians(latMin), Math.toRadians(lonMin), Math.toRadians(latMax), Math.toRadians(lonMax));
        }
      });
      JPanel subPanel = new JPanel(new BorderLayout());
      subPanel.add(tilingPanel, BorderLayout.CENTER);
      subPanel.add(boundsButton, BorderLayout.SOUTH);
      //                compositePanel.add(tilingPanel,BorderLayout.SOUTH);
      compositePanel.add(subPanel, BorderLayout.SOUTH);
      //                compositePanel.add(tilingPanel,BorderLayout.NORTH);

    }
    //         File dirFile = new File(getDirectory());
    //         selectedFileChanged(dirFile);

    compositePanel.setEnabled(isLibrary);

    return compositePanel;
  }
  /**
   * Not implemented for VMAP.
   * @throws IOException 
   * @see plugins.ImportAction#getDataSources(URL[])
   */
  public Enumeration getDataSources(URL urls[]) throws IOException  {
    throw new IOException("getDataSources(URL} not implemented for this action " + getClass().getName()); //$NON-NLS-1$
  }
  /**
   * @see plugins.ImportAction#getDataSources(java.lang.String[])
   */
  public Enumeration getDataSources(String fileNames[]) {
    Vector src = new Vector();
    for (int i = 0; i < fileNames.length; i++) {
      //           IlvVMAPDataSource source = new IlvVMAPDataSource(fileNames[i]);
      IlvMapDataSource source = (IlvMapDataSource) VMAPDefLess.newVMAPDataSource(fileNames[i]);
      ((IlvHierarchicalDataSource)source).setAcceptNullValues(false);
      IlvFeatureSelectorPanel.Feature[] features = featurePanel.getSelectedFeatures();
      //          String[] faccCodes = new String[features.length];
      ArrayList faccCodes = new ArrayList();
      if (features != null) {
        //                for (int j = 0; j < features.length; j++) {
        //                    if (!features[j].getMinorCode().startsWith("-1")) { //$NON-NLS-1$
        //                        faccCodes.add(features[j].getMinorCode());
        //                    } 
        //                }
        for (int j = 0; j < features.length; j++) {
          IlvFeatureSelectorPanel.Feature currentFeature = features[j];
          IlvFeatureSelectorPanel.Feature currentChild;
          if (!currentFeature.getMinorCode().startsWith("-1")) { //$NON-NLS-1$
            faccCodes.add(features[j].getMinorCode());
          }
          for (int k = 0; k < currentFeature.getChildCount(); k++) {
            currentChild = (IlvFeatureSelectorPanel.Feature) currentFeature.getChildAt(k);
            faccCodes.add(currentChild.getMinorCode());
          }
        }
      }
      //          source.setFaccCodeList((String[])faccCodes.toArray(new String[0]));
      VMAPDefLess.setFaccCodeList(source, (String[]) faccCodes.toArray(new String[0]));
      source.setManager(getView().getManager());
      //          source.setAreaOfinterest(tilingPanel.getLonMin(),tilingPanel.getLatMin(),tilingPanel.getLonMax(),tilingPanel.getLatMax());
      VMAPDefLess.setAreaOfinterest(source, tilingPanel.getLonMin(), tilingPanel.getLatMin(), tilingPanel.getLonMax(), tilingPanel.getLatMax());
      //          source.setTilingParameters(tilingPanel.isTiling(),tilingPanel.getRows(),tilingPanel.getColumns());
      VMAPDefLess.setTilingParameters(source, tilingPanel.isTiling(), tilingPanel.getRows(), tilingPanel.getColumns());

      source.setName(getFormatName() + " (" + new File(fileNames[i]).getName() + ")"); //$NON-NLS-1$//$NON-NLS-2$
      src.add(source);
    }
    return src.elements();
  }

  /**
   * @see plugins.ImportAction#approveSelection(File [])
   */
  public boolean approveSelection(File selection[]) {
    IlvFeatureSelectorPanel.Feature[] features = featurePanel.getSelectedFeatures();
    if (features == null || features.length == 0) {
      JOptionPane.showMessageDialog(view, IlvMapUtil.getString(VMAPLoadAction.class, "VMAPLoadAction.NoFeatureMessage"), //$NON-NLS-1$
          IlvMapUtil.getString(VMAPLoadAction.class, "VMAPLoadAction.NoFeatureTitle"),//$NON-NLS-1$
          JOptionPane.ERROR_MESSAGE);
      return false;
    }
    return super.approveSelection(selection);
  }

  /**
   * @see plugins.ImportAction#getFormatName()
   */
  public String getFormatName() {

    return ilog.views.maps.IlvMapUtil.getString(getClass(), "VMAPLoadAction.FormatName"); //$NON-NLS-1$
  }

  /**
   * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
   */
  public boolean accept(File pathname) {
    boolean dir=false;
    try {
      dir=pathname.isDirectory();
    } catch (AccessControlException e){
      // applets.
    }
    return (dir);
  }

  /**
   * @see plugins.ImportAction#getExtensions()
   */
  public String[] getExtensions() {
    return null; //select any directory
  }

  /**
   * @see plugins.ImportAction#isAvailable()
   */
  public boolean isAvailable() {
    return super.isAvailable() && VMAPDefLess.isAvailable();
  }
}