/**
 * Copyright (C) 2009 - 2010 by OpenGamma Inc.
 * 
 * Please see distribution for license.
 */
package com.opengamma.financial.analytics.greeks;

import java.util.Map;
import java.util.Set;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueRequirementNames;
import com.opengamma.financial.greeks.Greek;
import com.opengamma.util.ArgumentChecker;

/**
 * 
 */
public class AvailableGreeks {
  private static final BiMap<String, Greek> AVAILABLE_GREEKS;

  static {
    AVAILABLE_GREEKS = HashBiMap.create();
    AVAILABLE_GREEKS.put(ValueRequirementNames.FAIR_VALUE, Greek.FAIR_PRICE);
    AVAILABLE_GREEKS.put(ValueRequirementNames.DELTA, Greek.DELTA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.DELTA_BLEED, Greek.DELTA_BLEED);
    AVAILABLE_GREEKS.put(ValueRequirementNames.STRIKE_DELTA, Greek.STRIKE_DELTA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.DRIFTLESS_DELTA, Greek.DRIFTLESS_THETA);

    AVAILABLE_GREEKS.put(ValueRequirementNames.GAMMA, Greek.GAMMA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.GAMMA_P, Greek.GAMMA_P);
    AVAILABLE_GREEKS.put(ValueRequirementNames.STRIKE_GAMMA, Greek.STRIKE_GAMMA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.GAMMA_BLEED, Greek.GAMMA_BLEED);
    AVAILABLE_GREEKS.put(ValueRequirementNames.GAMMA_P_BLEED, Greek.GAMMA_P_BLEED);

    AVAILABLE_GREEKS.put(ValueRequirementNames.VEGA, Greek.VEGA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.VEGA_P, Greek.VEGA_P);
    AVAILABLE_GREEKS.put(ValueRequirementNames.VARIANCE_VEGA, Greek.VARIANCE_VEGA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.VEGA_BLEED, Greek.VEGA_BLEED);

    AVAILABLE_GREEKS.put(ValueRequirementNames.THETA, Greek.THETA);

    AVAILABLE_GREEKS.put(ValueRequirementNames.RHO, Greek.RHO);
    AVAILABLE_GREEKS.put(ValueRequirementNames.CARRY_RHO, Greek.CARRY_RHO);

    AVAILABLE_GREEKS.put(ValueRequirementNames.ZETA, Greek.ZETA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.ZETA_BLEED, Greek.ZETA_BLEED);
    AVAILABLE_GREEKS.put(ValueRequirementNames.DZETA_DVOL, Greek.DZETA_DVOL);

    AVAILABLE_GREEKS.put(ValueRequirementNames.ELASTICITY, Greek.ELASTICITY);
    AVAILABLE_GREEKS.put(ValueRequirementNames.PHI, Greek.PHI);

    AVAILABLE_GREEKS.put(ValueRequirementNames.ZOMMA, Greek.ZOMMA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.ZOMMA_P, Greek.ZOMMA_P);

    AVAILABLE_GREEKS.put(ValueRequirementNames.ULTIMA, Greek.ULTIMA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.VARIANCE_ULTIMA, Greek.VARIANCE_ULTIMA);

    AVAILABLE_GREEKS.put(ValueRequirementNames.SPEED, Greek.SPEED);
    AVAILABLE_GREEKS.put(ValueRequirementNames.SPEED_P, Greek.SPEED_P);

    AVAILABLE_GREEKS.put(ValueRequirementNames.VANNA, Greek.VANNA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.VARIANCE_VANNA, Greek.VARIANCE_VANNA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.DVANNA_DVOL, Greek.DVANNA_DVOL);

    AVAILABLE_GREEKS.put(ValueRequirementNames.VOMMA, Greek.VOMMA);
    AVAILABLE_GREEKS.put(ValueRequirementNames.VOMMA_P, Greek.VOMMA_P);
    AVAILABLE_GREEKS.put(ValueRequirementNames.VARIANCE_VOMMA, Greek.VARIANCE_VOMMA);
  }

  public static Greek getGreekForValueRequirementName(final String valueName) {
    if (!AVAILABLE_GREEKS.containsKey(valueName)) {
      throw new IllegalArgumentException("Could not get greek for ValueRequirementName " + valueName);
    }
    return AVAILABLE_GREEKS.get(valueName);
  }

  public static Greek getGreekForValueRequirement(final ValueRequirement requirement) {
    final String greekName = requirement.getValueName();
    if (!AVAILABLE_GREEKS.containsKey(greekName)) {
      throw new IllegalArgumentException("Could not get greek for ValueRequirement " + requirement.toString());
    }
    return AVAILABLE_GREEKS.get(greekName);
  }

  public static Set<String> getAllGreekNames() {
    return AVAILABLE_GREEKS.keySet();
  }

  public static Map<String, Greek> getAllGreekNamesAndGreeks() {
    return AVAILABLE_GREEKS;
  }

  public static String getValueRequirementNameForGreek(final Greek greek) {
    ArgumentChecker.notNull(greek, "greek");
    return AVAILABLE_GREEKS.inverse().get(greek);
  }
}

@@ -995,19 +995,19 @@
 IFTLESS_
-DEL
+THE
 TA, Gree

Corrected the name of a greek; DRIFTLESS_DELTA -> DRIFTLESS_THETA