#region Using ステートメント

using System;
using System.Collections.Generic;
using System.Text;

#endregion

namespace MikuMikuDance.XNA.Debug
{
    /// <summary>
    /// デバッグコマンドのメッセージタイプ(伊藤 雄一(HN:ひげねこ)作)
    /// </summary>
    public enum DebugCommandMessage
    {
        /// <summary>
        /// 標準出力
        /// </summary>
        Standard = 1,

        /// <summary>
        /// エラー出力
        /// </summary>
        Error = 2,

        /// <summary>
        /// 警告出力
        /// </summary>
        Warning = 3
    }

    /// <summary>
    /// デバッグコマンド実行用のデリゲーション
    /// </summary>
    /// <param name="host">実行を発行したホスト</param>
    /// <param name="command">コマンド</param>
    /// <param name="arguments">コマンドの引数</param>
    public delegate void DebugCommandExecute( IDebugCommandHost host, string command,
                                                            IList<string> arguments );

    /// <summary>
    /// デバッグコマンドメッセージのリスナー用インターフェース
    /// </summary>
    public interface IDebugEchoListner
    {
        /// <summary>
        /// メッセージの出力
        /// </summary>
        /// <param name="messageType">メッセージの種類</param>
        /// <param name="text">メッセージ</param>
        void Echo( DebugCommandMessage messageType, string text );
    }

    /// <summary>
    /// デバッグコマンドホスト用のインターフェース
    /// </summary>
    public interface IDebugCommandHost : IDebugEchoListner
    {
        /// <summary>
        /// コマンドの登録
        /// </summary>
        /// <param name="command">コマンド</param>
        /// <param name="description">コマンドの説明</param>
        /// <param name="callback">実行時のデリゲーション</param>
        void RegisterCommand( string command, string description,
                                                        DebugCommandExecute callback );

        /// <summary>
        /// コマンドの登録解除
        /// </summary>
        /// <param name="command">コマンド</param>
        void UnregisterCommand( string command );

        /// <summary>
        /// コマンドの実行
        /// </summary>
        /// <param name="command">コマンド</param>
        void ExecuteCommand( string command );

        /// <summary>
        /// 標準メッセージ出力
        /// </summary>
        /// <param name="text"></param>
        void Echo( string text );

        /// <summary>
        /// 警告メッセージ出力
        /// </summary>
        /// <param name="text"></param>
        void EchoWarning( string text );

        /// <summary>
        /// エラーメッセージ出力
        /// </summary>
        /// <param name="text"></param>
        void EchoError( string text );

        /// <summary>
        /// メッセージ出力リスナーの登録
        /// </summary>
        /// <param name="listner"></param>
        void RegisterEchoListner( IDebugEchoListner listner );

        /// <summary>
        /// メッセージ出力リスナーの登録解除
        /// </summary>
        /// <param name="listner"></param>
        void UnregisterEchoListner( IDebugEchoListner listner );
    }

}
