/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/* ***************************************************** */

// chamfer.h
// declaration for fillet module
#if !defined( __CHAMFER_H__)
#define __CHAMFER_H__
#include <memory>  // for std::unique_ptr
#include "mg/Straight.h"

class MGCurve;

namespace mgcalc{
	/**
	 *  class ChamferParam
	 *
	 *  面取り計算に使用するデータで、論理的にまとまりのあるものを
	 *  クラス化したもの
	 */
	class ChamferParam{
	public:
		/// デフォルトコンストラクタ
		ChamferParam() : m_curve(0){}

		/// このオブジェクトが有効であるかどうかを調べる
		bool is_null() const{ return m_curve == 0;}

		/// 曲線を返す
		const MGCurve* curve() const{ return m_curve;}

		/// 面取り距離を返す
		double distance() const{ return m_distance;}

		/// 曲線のピック位置をパラメータの形式で返す
		double hint() const{ return m_hint;}

		/**
		 *  @brief  面取りデータをセットする
		 *  @param  curve     面取りする曲線の一方
		 *  @param  distance  面取り距離
		 *  @param  hint      @a curve のピック位置におけるパラメータ
		 *
		 *  @a distance が不の値であると、この関数は失敗する。
		 *  @a hint が @a curve の定義域外の値であるとき、この関数は失敗する。
		 */
		bool set(const MGCurve* curve, double distance, double hint);

	private:
		const MGCurve*  m_curve;     ///< 面取りする曲線
		double          m_distance;  ///< 面取り距離
		double          m_hint;      ///< 曲線のピック位置
	};

	/**
	 *  class ChamferResult
	 *
	 *  面取り計算の結果の型
	 */
	class ChamferResult{
	public:
		ChamferResult(const ChamferParam* param1, const ChamferParam* param2);
		~ChamferResult();

		/// 面取り計算開始
		bool chamfer();

		/**
		 *  @brief  面取り部分の曲線を生成する
		 *
		 *  関数 @c chamfer() の呼出し後でないと、この関数は失敗する。
		 */
		MGCurve* chamfer_line() const;

		/**
		 *  @brief  面取り後の曲線の形状を生成する
		 *  @param  i  どちら側の曲線か
		 *
		 *  @i は 1 か 2 で指定する
		 *  コンストラクタの第1引数として指定した側ならば 1 を、
		 *  第2引数として使用した側ならば 2 を指定すればよい。
		 *  それ以外の値を指定すると、この関数は失敗する。
		 *
		 *  関数 @c chamfer() の呼出し後でないと、この関数は失敗する。
		 */
		std::unique_ptr<MGCurve> trimmed_curve(int i) const;

	private:
		class Private;
		std::unique_ptr<Private> m_impl;
	};
} // namespace mgcalc

#endif //__CHAMFER_H__
