/**
 * 最初の著者:: トゥイー
 * リポジトリ情報:: $Id: SAPIRecognition.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_SAPI_RECOGNITION_HPP_
#define _SPEECH_CONTROLLER_FRAMEWORK_SAPI_SAPI_RECOGNITION_HPP_

#include "spcf/core/Recognition.hpp"

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

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

#include <deque>
#include <string>

namespace spcf {

	class SAPIRecognition : public Recognition {
	private:
		CComPtr<ISpRecoResult> recognition_;
		SPPHRASE* phrase_;
		std::string rulename_;
		RecognitionPropertyContainer properties_;

	public:
		/**
		 * 認識結果を構築します。
		 */
		SAPIRecognition(CSpEvent& event);

		/**
		 * 認識結果を破棄します。
		 */
		virtual ~SAPIRecognition();

	public:
		std::string getText();
		std::string getGrammarName();

	public:
		/**
		 * 認識結果が有効かどうかを判定します。
		 *
		 * @return 有効な場合はtrueを、無効な場合はfalseを返します。
		 */
		operator bool() const {
			return 0!=phrase_;
		}

		/**
		 * 認識結果が無効かどうかを判定します。
		 *
		 * @return 無効な場合はtrueを、有効な場合はfalseを返します。
		 */
		bool operator!() const {
			return 0==phrase_;
		}

	public:
		/**
		 * 認識対象音声をWAVファイルに記録します。
		 */
		HRESULT record(const std::string& filename);

	public:
		/**
		 * プロパティの数を取得します。
		 */
		size_t sizeOfProperties() const {
			return properties_.size();
		}

		RecognitionPropertyIterator beginProperty() {
			return properties_.begin();
		}

		RecognitionPropertyConstIterator beginProperty() const {
			return properties_.begin();
		}

		RecognitionPropertyIterator endProperty() {
			return properties_.end();
		}

		RecognitionPropertyConstIterator endProperty() const {
			return properties_.end();
		}

	public:
		/**
		 * 指定した名前のプロパティの数を取得します。
		 */
		size_t sizeOfProperties(const std::string& name) const;

		/**
		 * 指定したインデックスのプロパティを取得します。
		 */
		RecognitionPropertyPtr getProperty(size_t index) const;

		RecognitionPropertyPtr getProperty(const std::string& name) const;

		/**
		 * 指定した名前のn番目のプロパティを取得します。
		 */
		RecognitionPropertyPtr getProperty(const std::string& name, size_t n) const;
	};

}  // namespace spcf

#endif
