package org.testng.internal;

import org.testng.ITestResult;
import org.testng.collections.Maps;

import java.util.Map;
import java.util.Properties;



/**
 * Constants used by TestNG
 *
 * @author Cedric Beust, May 2, 2004
 *
 */
public class Constants {
  private static final String NAMESPACE = "testng";

////////  //
  // Properties
  //
  public static final String PROP_OUTPUT_DIR = NAMESPACE + "." + "outputDir";
//  public static final String PROP_NAME = NAMESPACE + "." + "name";
//  public static final String PROP_INCLUDED_GROUPS = NAMESPACE + "." + "includedGroups";
//  public static final String PROP_EXCLUDED_GROUPS = NAMESPACE + "." + "excludedGroups";
//  public static final String PROP_CLASS_NAMES = NAMESPACE + "." + "classNames";
//  public static final String PROP_VERBOSE = NAMESPACE + "." + "verbose";
//  public static final String PROP_JUNIT= NAMESPACE + "." + "junit";
//  public static final String PROP_QUIET= NAMESPACE + "." + "quiet";
//  public static final String PROP_GROUP= NAMESPACE + "." + "group";

  private static final TestNGProperty[] COMMAND_LINE_PARAMETERS = {
    new TestNGProperty("-d", PROP_OUTPUT_DIR, "Directory where the result files will be created.", "test-output"),
  };

  private static final Map<String, TestNGProperty> m_propertiesByName = Maps.newHashMap();

  static {
//    for (int i = 0; i < PROPERTIES.length; i++) {
//      m_propertiesByName.put(PROPERTIES[i].getName(), PROPERTIES[i]);
//    }
    for (TestNGProperty element : COMMAND_LINE_PARAMETERS) {
      m_propertiesByName.put(element.getName(), element);
    }
  }

  private static TestNGProperty getProperty(String propertyName) {
    TestNGProperty result = m_propertiesByName.get(propertyName);
    assert null != result : "Unknown property : " + propertyName;

    return result;
  }

  public static String getPropertyValue(Properties p, String propertyName) {
    TestNGProperty r= getProperty(propertyName);
    assert null != r : "Unknown property : " + propertyName;

    String result = p.getProperty(r.getName());

    return result;
  }

  public static boolean getBooleanPropertyValue(Properties properties, String propertyName) {
    TestNGProperty p = getProperty(propertyName);
    String r = properties.getProperty(propertyName, p.getDefault());
    boolean result = "true".equalsIgnoreCase(r);

    return Boolean.valueOf( result).booleanValue();
  }

  public static int getIntegerPropertyValue(Properties properties, String propertyName) {
    TestNGProperty p = getProperty(propertyName);
    String r = properties.getProperty(propertyName, p.getDefault());
    int result = Integer.parseInt(r);

    return result;
  }

  public static String getDefaultValueFor(String propertyName) {
    TestNGProperty p = getProperty(propertyName);
    return p.getDefault();
  }

  /**
   * @param status
   * @return
   */
  public static String displayStatus(int status) {
    if (ITestResult.SKIP == status) {
      return "SKIP";
    } else if (ITestResult.SUCCESS == status) {
      return "SUCCESS";
    } else if (ITestResult.FAILURE == status) {
      return "FAILURE";
    } else {
      return "UNKNOWN_STATUS";
    }
  }

}
