/*
 * 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.IlvExceptionMessage;
import ilog.views.maps.datasource.IlvMapDataSource;
import ilog.views.maps.format.dted.IlvRasterDTEDReader;
import ilog.views.maps.raster.IlvRasterAbstractReader;
import ilog.views.maps.raster.datasource.IlvRasterDataSourceFactory;
import ilog.views.maps.raster.datasource.IlvThreadMonitoringData;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.security.AccessControlException;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

/**
 * Class that manages DTED import action.
 */
public class DTEDLoadAction extends DefaultLoadAction {
  /**
   * Creates an action for the specified view
   * @param view view to add map data to.
   */
  public DTEDLoadAction(IlvManagerView view) {
    super(view);
  }
  /**
   * @see plugins.ImportAction#getSubDirectory()
   */
  protected String getSubDirectory() {
   return IlvMapUtil.getString(getClass(),"DTEDLoadAction.CDDirectory"); //$NON-NLS-1$
  }
  
  /**
   * @see plugins.DefaultLoadAction#makeReader(java.lang.String)
   */
  public IlvRasterAbstractReader makeReader(String fileName)
  {
    return makeReader(new String[] {fileName},null);
  }
  
  /**
   * @see plugins.DefaultLoadAction#makeReader(URL)
   */
  public IlvRasterAbstractReader makeReader(URL url) throws IOException
  {
    IlvRasterDTEDReader r = new IlvRasterDTEDReader();
    r.addMap(url);
    return r;
  }  
  /**
   * @param monitorData
 * @see plugins.DefaultLoadAction#makeReader(java.lang.String)
   */
  IlvRasterAbstractReader makeReader(String[] fileNames, IlvThreadMonitoringData monitorData)
  {
      Vector fileList=new Vector();     
       boolean asked=false;
      IlvRasterDTEDReader r = new IlvRasterDTEDReader();
      for (int j = 0; j < fileNames.length; j++) {          
          compileDTEDImages(fileNames[j],fileList);
          if(fileList.size()>1000 && !asked) {
            asked=true;
            int ans=JOptionPane.showConfirmDialog(getView(),
                IlvMapUtil.getString(getClass(),"DTEDLoadAction.TooManyFiles")); //$NON-NLS-1$
            if(ans == JOptionPane.NO_OPTION){
              break;
            } else if(ans != JOptionPane.YES_OPTION){
              return null;
            }
          }
      }
      int size=fileList.size();
      LoadDataRunnable runnable = null;
      if (Thread.currentThread() instanceof LoadDataRunnable) {
          runnable = (LoadDataRunnable)Thread.currentThread();
      }
      for (int i = 0; i < size; i++) {
          try {
              r.addMap((String)fileList.get(i));
              if (monitorData != null) {
                  int percent = Math.round(i/(float)size * 100);
                  monitorData.updateProgress(percent);
              }
          } catch(IOException e) {
              String errorMsg=IlvMapUtil.getString(getClass(),"DTEDLoadAction.Error"); //$NON-NLS-1$
              new IlvExceptionMessage(e,errorMsg+(String)fileList.get(i)); 
          }
          if (runnable != null) {
              if (runnable.wasStoppedCleanly()) {
                  if(monitorData!=null) {
                    monitorData.updateProgress(100);
                  }
                  break;
              }              
          }
      }
      return r;
  }
  
  /**
   * @see plugins.DefaultLoadAction#getExtensions()
   */
  public String [] getExtensions(){
    return new String[]{".dt0", //$NON-NLS-1$
        ".dt1", //$NON-NLS-1$
        ".dt2", //$NON-NLS-1$
        ".dt3"}; //$NON-NLS-1$
  }
  
  private void compileDTEDImages(String fileName,Vector fileList) {
    File f=new File(fileName);
    boolean dir=false;
    try {
      dir=f.isDirectory();
    } catch (AccessControlException e){
      // applets.
    }
    if(dir){
      File sub[]=f.listFiles();
      for (int i = 0; i < sub.length; i++) {
        compileDTEDImages(sub[i].getPath(),fileList);
      }
    } else if (accept(f)) {
      fileList.add(fileName);
    }
  }
  
  /** Loads data by creating a data source with a specific reader for each of the files passed.
   * @see #makeReader(String)
   * @see plugins.ImportAction#getDataSources(java.lang.String[])
   */
  public Enumeration getDataSources(String fileNames[]) {   
    return new FileTableLoader(fileNames,this) {
        /**
         * @see java.util.Enumeration#nextElement()
         */
        public Object nextElement() {
          if(hasMoreElements()) {
//            int i=currentFile;
//            File f=new File(fileNames[i]);
            String name = new File((String)fileNames[currentFile]).getName() + "~" + new File((String)fileNames[fileNames.length-1]).getName();             //$NON-NLS-1$
            IlvThreadMonitoringData monitorData=new IlvThreadMonitoringData(importAction.getMonitor(),fileNames,
                    name + " " + importAction.getActivityDescription(RENDERING) ,0,100); //$NON-NLS-1$
                
            IlvMapDataSource dataSource;
            IlvRasterAbstractReader r=((DTEDLoadAction)importAction).makeReader((String[])fileNames,monitorData);
            if(r!=null) {
              dataSource = IlvRasterDataSourceFactory.buildTiledImageDataSource(
                  importAction.getView().getManager(),
                  r,
                  true,true,monitorData);
                    dataSource.setName(importAction.getFormatName()+" "+name); //$NON-NLS-1$
                    currentFile = this.fileNames.length;            
                    return dataSource;
            }
          }
          return null;
        }
    };
  }
  
  /**
   * returns JFileChooser.FILES_AND_DIRECTORIES
   * @see plugins.ImportAction#getSelectionMode()
   */
  public int getSelectionMode() {
    return JFileChooser.FILES_AND_DIRECTORIES;
  }
  
  /**
   * @see plugins.DefaultLoadAction#getFormatName()
   */
  public String getFormatName() {
    return ilog.views.maps.IlvMapUtil.getString(getClass(),"DTEDLoadAction.FormatName"); //$NON-NLS-1$
  }
  /**
   * @see plugins.ImportAction#approveSelection(java.io.File[])
   */
  public boolean approveSelection(File selection[]) {
    if(selection.length==1){
      if(selection[0].getParent()==null)return false;
    }
    return super.approveSelection(selection);
  }
}