#pragma once

#include "../MFMTwoCurrency.h"
#include "../../random_process/InterestRateTimeSliceProcess.h"
#include "../../random_process/FXTimeSliceProcess.h"
#include "CalibratorTwoCurrency.h"
#include "../ProcessCorrelations3d.h"
#include "../SliceValuatorTwoCurrency.h"


//////////////////////////////////////////////////////////////////////////////////////
// TODO, 
// 
// correct as neccessary to create a general class not dependent 
// on any hull white inputs. Getting the model working in a general setting 
// should just be a matter of feeding the right inputs to the 
// MFMTwoCurrency constructor
//////////////////////////////////////////////////////////////////////////////////////

class ADMFMTwoCurrency : public MFMTwoCurrency<TwoCurrencyArrowDebreuCalibrator>
{

public:

	// TODO uncomment this constructor and correct
	/*
	ADMFMTwoCurrency(
		size_t gridpoints_per_slice, double sd_spread, size_t poly_order, gelib::d_vector const& times,

		// domestic and foreign discount factors at mean reversion parameters
		const std::array<double, 2>& mean_reversion_params,

		// domestic and foreign discount factors at T1
		const std::array<double, 2>& discount_factors_t1,

		// domestic and foreign accrual factors
		const std::array<gelib::d_vector, 2>& accrual_factors,

		// domestic and foreign fwd libors
		const std::array<gelib::d_vector, 2>& forward_libors,

		// domestic caplet, FX option, foreign caplet
		const std::array<gelib::d_vector, 3>& option_volatilities,

		// variances of x,y and z
		const std::array<gelib::d_vector, 3>& process_volatilities,

		// correlations between three variables
		// ie the C*
		const std::array<gelib::d_vector, 3>& process_correlations);
		*/
	void constructor_check(
		size_t gridpoints_per_slice, double sd_spread, size_t poly_order, gelib::d_vector const& times,
		const std::array<double, 2>& mean_reversion_params,
		const std::array<double, 2>& discount_factors_t1,
		const std::array<gelib::d_vector, 2>& accrual_factors,
		const std::array<gelib::d_vector, 2>& forward_libors,
		const std::array<gelib::d_vector, 3>& option_volatilities,
		const std::array<gelib::d_vector, 3>& process_volatilities,
		const std::array<gelib::d_vector, 3>& process_correlations);
};
