/*
 * Created on 09.08.2003
 *  
 */
package net.sourceforge.phpdt.internal.ui.util;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import net.sourceforge.phpeclipse.ui.overlaypages.ProjectPrefUtil;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.preference.IPreferenceStore;

public class PHPFileUtil {
  private static String[] PHP_EXTENSIONS = null;

  public final static String[] SMARTY_EXTENSIONS = { "tpl" };

  public static boolean isPHPFile(IFile file) {
    String extension = file.getFileExtension();
    return isPHPFileName(file.getLocation().toString());
  }

  public final static String getFileExtension(String name) {
    int index = name.lastIndexOf('.');
    if (index == -1)
      return null;
    if (index == (name.length() - 1))
      return null; //$NON-NLS-1$
    return name.substring(index + 1);
  }

  /**
   * Returns true iff str.toLowerCase().endsWith(".php") implementation is not creating extra strings.
   */
  public final static boolean isPHPFileName(String name) {
    String extension = getFileExtension(name);
    if (extension == null) {
      return false;
    }
    extension = extension.toLowerCase();
    PHP_EXTENSIONS = getExtensions();
    if (PHP_EXTENSIONS == null) {
      return false;
    }
    for (int i = 0; i < PHP_EXTENSIONS.length; i++) {
      if (extension.equals(PHP_EXTENSIONS[i])) {
        return true;
      }
    }
    return false;
  }

  /**
   * Returns true iff the file extension is a valid PHP Unit name implementation is not creating extra strings.
   */
  public final static boolean isValidPHPUnitName(String filename) {
    return PHPFileUtil.isPHPFileName(filename);
  }

  /**
   * @return Returns the PHP extensions.
   */
  public static String[] getExtensions() {
    if (PHP_EXTENSIONS == null) {
      ArrayList list = new ArrayList();
      final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
      String extensions = store.getString(PHPeclipsePlugin.PHP_EXTENSION_PREFS);
      extensions = extensions.trim();
      if (extensions.length() != 0) {
        StringTokenizer tokenizer = new StringTokenizer(extensions, " ,;:/-|");
        String token;
        while (tokenizer.hasMoreTokens()) {
          token = tokenizer.nextToken();
          if (token != null && token.length() >= 1) {
            list.add(token);
          }
        }
        if (list.size() != 0) {
          PHP_EXTENSIONS = new String[list.size()];
          for (int i = 0; i < list.size(); i++) {
            PHP_EXTENSIONS[i] = (String) list.get(i);
          }
        }
      }
    }
    return PHP_EXTENSIONS;
  }

  /**
   * @param php_extensions
   *          The PHP extensions to set.
   */
  public static void setExtensions(String[] php_extensions) {
    PHP_EXTENSIONS = php_extensions;
  }

  /**
   * Creata the file for the given absolute file path
   * 
   * @param absoluteFilePath
   * @param project
   * @return the file for the given absolute file path or <code>null</code> if no existing file can be found
   */
  public static IFile createFile(IPath absoluteFilePath, IProject project) {
    if (absoluteFilePath == null || project == null) {
      return null;
    }

    String projectPath = project.getLocation().toString();
    String filePath = absoluteFilePath.toString().substring(projectPath.length() + 1);
    return project.getFile(filePath);

  }

  /**
   * Determine the path of an include name string
   * 
   * @param includeNameString
   * @param resource
   * @param project
   * @return the path for the given include filename or <code>null</code> if no existing file can be found
   */
  public static IPath determineFilePath(String includeNameString, IResource resource, IProject project) {
    IPath documentRootPath = ProjectPrefUtil.getDocumentRoot(project);
    IPath resourcePath = resource.getProjectRelativePath();

    File file = null;
    IPath path = null;
    path = documentRootPath.append(includeNameString);
    file = path.toFile();
    if (file.exists()) {
      return path;
    }

    if (includeNameString.startsWith("../")) {
      path = project.getLocation().append(resourcePath.removeLastSegments(1));
      path = path.append(includeNameString);
      file = path.toFile();
      if (file.exists()) {
        return path;
      }
    }

    //    int index = includeNameString.indexOf('/');
    //    if (index < 0) {
    // includeNameString contains no path separator
    path = project.getLocation().append(resourcePath.removeLastSegments(1));
    path = path.append(includeNameString);
    file = path.toFile();
    if (file.exists()) {
      return path;
    }
    //    }

    List includePaths = ProjectPrefUtil.getIncludePaths(project);
    if (includePaths.size() > 0) {
      for (int i = 0; i < includePaths.size(); i++) {
        path = new Path(includePaths.get(i).toString()).append(includeNameString);
        file = path.toFile();
        if (file.exists()) {
          return path;
        }
      }
    }
    return null;
  }
}