/*
 * Created on Feb 27, 2013
 *
 * PLACE_YOUR_DISTRIBUTION_STATEMENT_RIGHT_HERE
 */
package org.eclipse.osee.ote.version.svn;

import java.io.File;
import java.net.URI;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.team.svn.core.utility.SVNUtility;

public class ScriptToProject {

   private final Map<String, Set<String>> projectsScriptsMap = new HashMap<>();
   private final Map<String, File> scriptNameToScriptFileMap = new HashMap<>();
   private final IProject[] workspaceProjects;

   public ScriptToProject(IProject[] workspaceProjects) {
      this.workspaceProjects = workspaceProjects;
   }

   public void add(File scriptFile) {
      String scriptName = scriptFile.getName();
      IProject scriptProject = null;
      IFile iFile = null;
      IFile[] files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(org.eclipse.core.filesystem.URIUtil.toURI(scriptFile.getAbsolutePath()));
      if(files.length > 0){
         iFile = files[0];                     
      }
      for(IProject project:workspaceProjects){
         String projectName = project.getName();
         if(iFile.toString().contains(projectName)){
            scriptProject = project;
         }
      }
      if(scriptProject != null){
         URI scriptProjectLocationUri = scriptProject.getLocationURI();
         File scriptProjectFile = new File(scriptProjectLocationUri);

         if (isSvn(scriptProjectFile)) {
            String scriptProjectLocation = scriptProjectFile.getAbsolutePath();
            addScriptListValue(scriptProjectLocation, scriptName);
            scriptNameToScriptFileMap.put(scriptName, scriptFile);
         } 
      }
   }

   public Set<String> getProjectsSet() {
      return projectsScriptsMap.keySet();
   }

   public void addScriptListValue(String key, String value) {
      Set<String> values = projectsScriptsMap.get(key);
      if (values == null) {
         values = new HashSet<>();
         projectsScriptsMap.put(key, values);
      }
      values.add(value);
   }

   public File getScriptFileMatch(String project, String itemToMatch) {
      Set<String> scriptsForProject = projectsScriptsMap.get(project);
      if(scriptsForProject.contains(itemToMatch)){
         return scriptNameToScriptFileMap.get(itemToMatch);
      } else {
         return null;
      }
   }

   protected boolean isSvn(File file) {
      File svn = new File(file, SVNUtility.getSVNFolderName());
      return svn.exists();
   }
}
