/**
 * 最初の著者:: トゥイー
 * リポジトリ情報:: $Id: Phrase.hpp 26 2011-05-10 12:09:48Z yutaka_at_home $
 * 著作権:: Copyright (C) Ownway.info, 2011. All rights reserved.
 * ライセンス:: CPL(Common Public Licence)
 */

#ifndef _SPEECH_CONTROLLER_FRAMEWORK_SAPI_PHRASE_HPP_
#define _SPEECH_CONTROLLER_FRAMEWORK_SAPI_PHRASE_HPP_

#include "spcf/sapi/utils/PhraseProperty.hpp"

#include <atlbase.h>
#include <sphelper.h>

#include <iostream>
#include <string>
#include <vector>

namespace spcf {

	/**
	 * フレーズです。
	 */
	class Phrase {
	private:
		std::string phrase_;
		PhraseProperty property_;

	public:
		/**
		 * フレーズを構築します。
		 */
		Phrase(const std::string& phrase) : phrase_(phrase) {
		}

		/**
		 * フレーズを構築します。
		 */
		Phrase(const std::string& phrase, const PhraseProperty& property) :
		phrase_(phrase), property_(property) {
		}

	public:
		bool operator<(const Phrase& phrase) const {
			return phrase_<phrase.phrase_;
		}

	public:
		/**
		 * フレーズを取得します。
		 */
		const std::string& getPhrase() const {
			return phrase_;
		}

		/**
		 * プロパティを取得します。
		 */
		const PhraseProperty& getProperty() const {
			return property_;
		}

	public:
		/**
		 * このフレーズによる状態遷移を文法に追加します。
		 *
		 * @param grammar 文法を指定します。
		 * @param fromState 状態遷移の基点となる状態を指定します。
		 * @param toState 遷移先となる状態を指定します。
		 */
		HRESULT addTransition(const CComPtr<ISpRecoGrammar>& grammar,
		                      SPSTATEHANDLE fromState, SPSTATEHANDLE toState = (SPSTATEHANDLE) 0) const;
	};

}  // namespace spcf

#endif
