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

import com.opengamma.strata.product.credit.SeniorityLevel;

/**
 * Specifies the repayment precedence of a debt instrument.
 * <p>
 * This is also known as the <i>RED Tier Code</i>.
 */
public enum MarkitSeniorityLevel {

  /**
   * Senior domestic.
   */
  SECDOM,

  /**
   * Senior foreign.
   */
  SNRFOR,

  /**
   * Subordinate, Lower Tier 2.
   */
  SUBLT2,

  /**
   * Subordinate Tier 1.
   */
  PREFT1,

  /**
   * Subordinate, Upper Tier 2.
   */
  JRSUBUT2;

  //-------------------------------------------------------------------------
  /**
   * Converts Markit code to standard seniority level.
   * 
   * @return the converted level
   */
  public SeniorityLevel translate() {
    switch (this) {
      case SECDOM:
        return SeniorityLevel.SENIOR_SECURED_DOMESTIC;
      case SNRFOR:
        return SeniorityLevel.SENIOR_UNSECURED_FOREIGN;
      case SUBLT2:
        return SeniorityLevel.SUBORDINATE_LOWER_TIER_2;
      case PREFT1:
        return SeniorityLevel.SUBORDINATE_TIER_1;
      case JRSUBUT2:
        return SeniorityLevel.SUBORDINATE_UPPER_TIER_2;
      default:
        throw new IllegalStateException("Unmapped seniority level. Do not have mapping for " + this);
    }
  }

  /**
   * Converts seniority level to Markit equivalent.
   * 
   * @param seniorityLevel  the level to convert
   * @return the converted level
   */
  public static MarkitSeniorityLevel from(SeniorityLevel seniorityLevel) {
    switch (seniorityLevel) {
      case SENIOR_SECURED_DOMESTIC:
        return SECDOM;
      case SENIOR_UNSECURED_FOREIGN:
        return SNRFOR;
      case SUBORDINATE_LOWER_TIER_2:
        return SUBLT2;
      case SUBORDINATE_TIER_1:
        return PREFT1;
      case SUBORDINATE_UPPER_TIER_2:
        return JRSUBUT2;
      default:
        throw new IllegalArgumentException("Unknown seniority level. Do not have mapping for " + seniorityLevel);
    }
  }

}
