/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 1.3.40
 *
 * Do not make changes to this file unless you know what you are doing--modify
 * the SWIG interface file instead.
 * ----------------------------------------------------------------------------- */

package org.quantlib;

public class CreditDefaultSwap extends Instrument {
  private long swigCPtr;

  protected CreditDefaultSwap(long cPtr, boolean cMemoryOwn) {
    super(QuantLibJNI.SWIGCreditDefaultSwapUpcast(cPtr), cMemoryOwn);
    swigCPtr = cPtr;
  }

  protected static long getCPtr(CreditDefaultSwap obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }

  protected void finalize() {
    delete();
  }

  public synchronized void delete() {
    if (swigCPtr != 0) {
      if (swigCMemOwn) {
        swigCMemOwn = false;
        QuantLibJNI.delete_CreditDefaultSwap(swigCPtr);
      }
      swigCPtr = 0;
    }
    super.delete();
  }

  public CreditDefaultSwap(Protection.Side side, double notional, double spread, Schedule schedule, BusinessDayConvention paymentConvention, DayCounter dayCounter, boolean settlesAccrual, boolean paysAtDefaultTime) {
    this(QuantLibJNI.new_CreditDefaultSwap__SWIG_0(side.swigValue(), notional, spread, Schedule.getCPtr(schedule), schedule, paymentConvention.swigValue(), DayCounter.getCPtr(dayCounter), dayCounter, settlesAccrual, paysAtDefaultTime), true);
  }

  public CreditDefaultSwap(Protection.Side side, double notional, double spread, Schedule schedule, BusinessDayConvention paymentConvention, DayCounter dayCounter, boolean settlesAccrual) {
    this(QuantLibJNI.new_CreditDefaultSwap__SWIG_1(side.swigValue(), notional, spread, Schedule.getCPtr(schedule), schedule, paymentConvention.swigValue(), DayCounter.getCPtr(dayCounter), dayCounter, settlesAccrual), true);
  }

  public CreditDefaultSwap(Protection.Side side, double notional, double spread, Schedule schedule, BusinessDayConvention paymentConvention, DayCounter dayCounter) {
    this(QuantLibJNI.new_CreditDefaultSwap__SWIG_2(side.swigValue(), notional, spread, Schedule.getCPtr(schedule), schedule, paymentConvention.swigValue(), DayCounter.getCPtr(dayCounter), dayCounter), true);
  }

  public CreditDefaultSwap(Protection.Side side, double notional, double upfront, double spread, Schedule schedule, BusinessDayConvention paymentConvention, DayCounter dayCounter, boolean settlesAccrual, boolean paysAtDefaultTime) {
    this(QuantLibJNI.new_CreditDefaultSwap__SWIG_3(side.swigValue(), notional, upfront, spread, Schedule.getCPtr(schedule), schedule, paymentConvention.swigValue(), DayCounter.getCPtr(dayCounter), dayCounter, settlesAccrual, paysAtDefaultTime), true);
  }

  public CreditDefaultSwap(Protection.Side side, double notional, double upfront, double spread, Schedule schedule, BusinessDayConvention paymentConvention, DayCounter dayCounter, boolean settlesAccrual) {
    this(QuantLibJNI.new_CreditDefaultSwap__SWIG_4(side.swigValue(), notional, upfront, spread, Schedule.getCPtr(schedule), schedule, paymentConvention.swigValue(), DayCounter.getCPtr(dayCounter), dayCounter, settlesAccrual), true);
  }

  public CreditDefaultSwap(Protection.Side side, double notional, double upfront, double spread, Schedule schedule, BusinessDayConvention paymentConvention, DayCounter dayCounter) {
    this(QuantLibJNI.new_CreditDefaultSwap__SWIG_5(side.swigValue(), notional, upfront, spread, Schedule.getCPtr(schedule), schedule, paymentConvention.swigValue(), DayCounter.getCPtr(dayCounter), dayCounter), true);
  }

  public Protection.Side side() {
    return Protection.Side.swigToEnum(QuantLibJNI.CreditDefaultSwap_side(swigCPtr, this));
  }

  public double notional() {
    return QuantLibJNI.CreditDefaultSwap_notional(swigCPtr, this);
  }

  public double runningSpread() {
    return QuantLibJNI.CreditDefaultSwap_runningSpread(swigCPtr, this);
  }

  public double upfront() {
    return QuantLibJNI.CreditDefaultSwap_upfront(swigCPtr, this);
  }

  public boolean settlesAccrual() {
    return QuantLibJNI.CreditDefaultSwap_settlesAccrual(swigCPtr, this);
  }

  public boolean paysAtDefaultTime() {
    return QuantLibJNI.CreditDefaultSwap_paysAtDefaultTime(swigCPtr, this);
  }

  public double fairSpread() {
    return QuantLibJNI.CreditDefaultSwap_fairSpread(swigCPtr, this);
  }

  public double fairUpfront() {
    return QuantLibJNI.CreditDefaultSwap_fairUpfront(swigCPtr, this);
  }

  public double couponLegBPS() {
    return QuantLibJNI.CreditDefaultSwap_couponLegBPS(swigCPtr, this);
  }

  public double couponLegNPV() {
    return QuantLibJNI.CreditDefaultSwap_couponLegNPV(swigCPtr, this);
  }

  public double defaultLegNPV() {
    return QuantLibJNI.CreditDefaultSwap_defaultLegNPV(swigCPtr, this);
  }

  public double upfrontBPS() {
    return QuantLibJNI.CreditDefaultSwap_upfrontBPS(swigCPtr, this);
  }

  public double upfrontNPV() {
    return QuantLibJNI.CreditDefaultSwap_upfrontNPV(swigCPtr, this);
  }

  public double impliedHazardRate(double targetNPV, YieldTermStructureHandle discountCurve, DayCounter dayCounter, double recoveryRate, double accuracy) {
    return QuantLibJNI.CreditDefaultSwap_impliedHazardRate__SWIG_0(swigCPtr, this, targetNPV, YieldTermStructureHandle.getCPtr(discountCurve), discountCurve, DayCounter.getCPtr(dayCounter), dayCounter, recoveryRate, accuracy);
  }

  public double impliedHazardRate(double targetNPV, YieldTermStructureHandle discountCurve, DayCounter dayCounter, double recoveryRate) {
    return QuantLibJNI.CreditDefaultSwap_impliedHazardRate__SWIG_1(swigCPtr, this, targetNPV, YieldTermStructureHandle.getCPtr(discountCurve), discountCurve, DayCounter.getCPtr(dayCounter), dayCounter, recoveryRate);
  }

  public double impliedHazardRate(double targetNPV, YieldTermStructureHandle discountCurve, DayCounter dayCounter) {
    return QuantLibJNI.CreditDefaultSwap_impliedHazardRate__SWIG_2(swigCPtr, this, targetNPV, YieldTermStructureHandle.getCPtr(discountCurve), discountCurve, DayCounter.getCPtr(dayCounter), dayCounter);
  }

}
