/*******************************************************************************
 * Copyright (c) 2004, 2007 Boeing.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.osee.ote.define.operations;

import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.logging.Level;
import org.eclipse.core.filebuffers.manipulation.ContainerCreator;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.framework.plugin.core.util.OseeData;
import org.eclipse.osee.ote.define.OteDefinePlugin;

/**
 * @author Roberto E. Escobar
 */
public abstract class AbstractRemoteResourceRequestTemplate {
   private static final int CONNECTION_TIMEOUT = 120000;
   private static final int CONNECTION_READ_TIMEOUT = 10000;
   private IFile remoteFile;
   private final String tempFolderName;
   private final String remoteRequestUrl;

   public AbstractRemoteResourceRequestTemplate(String tempFolderName, String remoteRequestUrl) {
      super();
      this.tempFolderName = tempFolderName;
      this.remoteRequestUrl = remoteRequestUrl;
      this.remoteFile = null;
      createTemporaryDirectory();
   }

   private void createTemporaryDirectory() {
      try {
         final IProject project = OseeData.getProject();
         final IFolder folder = project.getFolder(tempFolderName + File.separator);
         if (folder != null && folder.exists() != true) {
            ContainerCreator containerCreator = new ContainerCreator(folder.getWorkspace(), folder.getFullPath());
            containerCreator.createContainer(new NullProgressMonitor());
         }
      } catch (CoreException ex1) {
         OseeLog.log(OteDefinePlugin.class, Level.SEVERE, ex1.toString(), ex1);
      }
   }

   private boolean isLocalFileAvailable(IFile file) {
      boolean found = false;
      if (file != null) {
         try {
            IFileStore store = EFS.getStore(file.getLocationURI());
            found = store.fetchInfo().exists();
         } catch (Exception ex) {
            OseeLog.log(OteDefinePlugin.class, Level.SEVERE, "Error retrieving file system. ", ex);
         }
      }
      return found;
   }

   public IFile getResults() {
      return remoteFile;
   }

   protected HttpURLConnection setupConnection(URL url) throws IOException {
      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
      connection.setConnectTimeout(CONNECTION_TIMEOUT);
      connection.setReadTimeout(CONNECTION_READ_TIMEOUT);
      return connection;
   }

   public int getTotalWork() throws Exception {
      return isLocalFileAvailable(getLocalStorageIFile()) != true ? 4 : 1;
   }

   private boolean isRemoteRequestNeeded() throws Exception {
      return isLocalFileAvailable(getLocalStorageIFile()) != true;
   }

   public void execute(IProgressMonitor monitor) throws Exception {
      if (isRemoteRequestNeeded() != false) {
         HttpURLConnection connection = null;
         try {
            monitor.setTaskName(String.format("Requesting Resource: [%s]", getRemoteFileName()));
            connection = setupConnection(new URL(remoteRequestUrl));
            connection.connect();
            monitor.worked(1);
            if (monitor.isCanceled() != true) {
               this.remoteFile = handleTransfer(monitor, connection);
               monitor.worked(1);
            }
         } finally {
            if (connection != null) {
               connection.disconnect();
            }
         }
      } else {
         this.remoteFile = getLocalStorageIFile();
      }
      monitor.worked(1);
   }

   protected IFile getLocalStorageIFile() throws Exception {
      return OseeData.getIFile(getLocalStorageName());
   }

   protected String getRemoteRequestUrl() {
      return remoteRequestUrl;
   }

   protected String getTempFolderName() {
      return tempFolderName;
   }

   protected abstract String getLocalStorageName() throws Exception;

   protected abstract String getRemoteFileName();

   protected abstract IFile handleTransfer(IProgressMonitor monitor, HttpURLConnection connection) throws Exception;

}