/*
 * Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.strata.report.framework.expression;

import java.util.List;

import com.google.common.collect.ImmutableSet;
import com.opengamma.strata.basics.currency.CurrencyAmount;
import com.opengamma.strata.calc.runner.CalculationFunctions;

/**
 * Evaluates a token against a currency amount.
 */
public class CurrencyAmountTokenEvaluator extends TokenEvaluator<CurrencyAmount> {

  private static final String CURRENCY_FIELD = "currency";
  private static final String AMOUNT_FIELD = "amount";

  @Override
  public Class<CurrencyAmount> getTargetType() {
    return CurrencyAmount.class;
  }

  @Override
  public ImmutableSet<String> tokens(CurrencyAmount amount) {
    return ImmutableSet.of(CURRENCY_FIELD, AMOUNT_FIELD);
  }

  @Override
  public EvaluationResult evaluate(
      CurrencyAmount amount,
      CalculationFunctions functions,
      String firstToken,
      List<String> remainingTokens) {

    if (firstToken.equalsIgnoreCase(CURRENCY_FIELD)) {
      return EvaluationResult.success(amount.getCurrency(), remainingTokens);
    }
    if (firstToken.equalsIgnoreCase(AMOUNT_FIELD)) {
      // Can be rendered directly - retains the currency for formatting purposes
      return EvaluationResult.success(amount, remainingTokens);
    }
    return invalidTokenFailure(amount, firstToken);
  }

}
