using System;
using System.Collections.Generic;
using System.Text;
using Yanesdk.System;
using Kyojin.Model;
using Yanesdk.Draw;
using Yamalib.Input;
using Yamalib.Util;
using Yamalib.GUI;
using Yanesdk.GUIParts;
using Yamalib;
using System.Diagnostics;
using Yanesdk.Input;

namespace Kyojin.Scene.EndingOption
{
    class EndingOptionScene : TaskBase, IDisposable
    {
        private delegate void EndSceneEvent();
        #region 定数値

        // ボタンの名前付け
        private enum eButtonID : int
        {
            AUTO_PLAY,
            SHOW_GUIDE,
            SHOW_MOVIE,
            SHOW_TIME,
            SHOW_SCORE,
            START,
            BACK,		// 終了、タイトル、戻る
        };

        // 表示位置
        private static readonly Point[] BT_POS = new Point[]{
			new Point(238,100),	// オートプレイ
			new Point(238,146),	// ガイド表示
			new Point(238,192),	// ムービー表示
			new Point(238,238),	// タイム表示
			new Point(238,284),	// スコア表示
			new Point(300,338),	// プレイ
			new Point(538,425),	// 戻る
        };

        // ボタンの画像番号
        private static readonly int[] BT_NO = new int[] {
				0,	// オートプレイ
				0,	// ガイド表示
				0,	// ムービー表示
				0,	// タイム表示
				0,	// スコア表示
				4,
				8
        };


        #endregion

        #region メンバフィールド

        private GameSystem m_gSys;
        private IMouseInput m_mouse;

        private ITexture m_titleTex;
        private RootCounterS m_tox;	//!< タイトルテクスチャのスライドインオフセット

        private ITexture bg;

        private FocusableTextureGUIControl textureGuiCtrl = new FocusableTextureGUIControl();
        private ControlContext ctrlContext;
        private List<FocusableTextureButton> m_button = new List<FocusableTextureButton>();
        private EndSceneEvent endSceneEvent = null;

        private readonly RootCounterS alpha;

        private bool init;

        #endregion

        public EndingOptionScene(GameSystem gameSystem)
        {
            m_gSys = gameSystem;
            alpha = new RootCounterS(0, 255, 4);
        }


        #region IDisposable メンバ

        public void Dispose()
        {
            YamalibUtility.Dispose(m_titleTex);
            textureGuiCtrl = null;
            ctrlContext = null;
            m_button = null;
        }

        #endregion

        public override int Task(object o)
        {
            GameSystem gameSystem = (GameSystem)o;
            if (0 == OnMove(gameSystem))
            {
                return 0;
            }
            gameSystem.OnMoveCommon();
            if (!gameSystem.FpsTimer.ToBeSkip)
            {
                gameSystem.Screen.Select();
                OnPaint(gameSystem);
                gameSystem.OnDrawCommon();
                gameSystem.Screen.Update();
            }
            else
            {
                OnPaint(gameSystem);
                gameSystem.OnDrawCommon();
            }
            return 1;
        }

        /// <summary>
        /// 動作処理
        /// </summary>
        /// <param name="gameSystem"></param>
        private int OnMove(GameSystem gameSystem)
        {
            // 初期化
            if (!init)
            {
                init = true;
                OnInit();
            }


            m_gSys.CommonSeLoader.UpdateSE();
            m_gSys.Screen.BlendSrcAlpha();
            alpha++;
            m_tox++;

            m_mouse.Update();
            m_gSys.Key.Update();

            textureGuiCtrl.OnMoveFocus();

            if (alpha.IsEnd && endSceneEvent != null)
            {
                endSceneEvent();
                return 0;
            }

            return 1;
        }

        /// <summary>
        /// 描画処理
        /// </summary>
        /// <param name="gameSystem"></param>
        private void OnPaint(GameSystem gameSystem)
        {

            // 初期化
            if (!init)
            {
                init = true;
                OnInit();
            }

            m_gSys.Screen.Clear();
            m_gSys.Screen.BlendSrcAlpha();

            if (!alpha.IsEnd)
            {
                m_gSys.Screen.SetColor(255, 255, 255, alpha.Value());
            }

            // 背景描画
            m_gSys.Screen.Blt(bg, 0, 0);
            // タイトル描画
            m_gSys.Screen.Blt(m_titleTex, m_tox.ValueSined(), 0);

            textureGuiCtrl.OnPaint(m_gSys.Screen);
        }


        #region 非公開メンバ

        private void OnInit()
        {
            m_mouse = m_gSys.KeyDecolateMouse;

            //コントロールの準備
            ctrlContext = new ControlContext();
            ctrlContext.MouseInput = ((NullableMouseInput)m_gSys.Mouse).GetOriginal() as MouseInput;
            ctrlContext.SmartTextureLoader = m_gSys.SmartTextureLoader;
            ctrlContext.SmartSoundLoader = m_gSys.SmartSoundLoader;
            ctrlContext.Param = new FocusableGUIParam(m_gSys.KeyDecolateMouse, m_gSys.Key);
            textureGuiCtrl = new FocusableTextureGUIControl();
            textureGuiCtrl.OnInit(ctrlContext);


            // ボタン生成
            string defFilename = "img2/ending/option/op_bt.lst";
            for (int i = 0; i < BT_POS.Length; i++)
            {
                FocusableTextureButton bt = new FocusableTextureButton(defFilename, false);
                bt.LoaderOffset = BT_NO[i];
                bt.OnClick += GetButtonEvent(i);
                TextureGUIControl.Control ctrl = new TextureGUIControl.Control(bt, (int)BT_POS[i].X, (int)BT_POS[i].Y);
                textureGuiCtrl.AddControl(ctrl);
                m_button.Add(bt);

                textureGuiCtrl.AddFocusGUI(bt);
            }

            // 背景テクスチャロード
            bg = YamalibConst.CreateTexture("img2/ending/option/bg.jpg");
            // タイトルテクスチャ
            m_titleTex = YamalibConst.CreateTexture("img2/ending/option/op_title_last.png");
            m_tox = new RootCounterS();
            m_tox.Set(-50, 0, 2);

            // ボタンの初期化
            for (int i = 0; i < m_button.Count; i++)
            {
                FocusableTextureButton bt = m_button[i];
                switch ((eButtonID)i)
                {
                    case eButtonID.AUTO_PLAY:
                    case eButtonID.SHOW_GUIDE:
                    case eButtonID.SHOW_MOVIE:
                    case eButtonID.SHOW_TIME:
                    case eButtonID.SHOW_SCORE:
                        {
                        }
                        break;
                    case eButtonID.START:
                        {
                        }
                        break;
                    case eButtonID.BACK:
                        {
                        }
                        break;
                    default:
                        Debug.Assert(false);
                        break;
                }
            }

            textureGuiCtrl.Focus(0);

        }

        //private bool autoPlayFlg = false;
        private bool showGuidFlg = false;
        private bool showMovieFlg = false;
        private bool showTimeFlg = false;
        private bool showScoreFlg = false;

        /// <summary>
        /// 各ボタンコントロールに付与するデリゲードを返却する
        /// </summary>
        /// <param name="buttonId"></param>
        /// <returns></returns>
        private TextureButton.MouseEvent GetButtonEvent(int buttonId)
        {
            switch ((eButtonID)buttonId)
            {
                case eButtonID.AUTO_PLAY:
                    return delegate(IScreen scr, ControlContext cc)
                    {
                        //m_gSys.KyojinEndingSceneParam.IsAutoPlay = !m_gSys.KyojinEndingSceneParam.IsAutoPlay;
                        //OnClickOption(m_button[(int)eButtonID.AUTO_PLAY], ref autoPlayFlg);
                        // ボタン押下SE再生
                        m_gSys.PlaySENegative();
                    };
                case eButtonID.SHOW_GUIDE:
                    return delegate(IScreen scr, ControlContext cc)
                    {
                        m_gSys.KyojinEndingSceneParam.IsShowGuide = !m_gSys.KyojinEndingSceneParam.IsShowGuide;
                        OnClickOption(m_button[(int)eButtonID.SHOW_GUIDE], ref showGuidFlg);
                        // ボタン押下SE再生
                        m_gSys.PlaySEActive();
                    };
                case eButtonID.SHOW_MOVIE:
                    return delegate(IScreen scr, ControlContext cc)
                    {
                        m_gSys.KyojinEndingSceneParam.IsShowMovie = !m_gSys.KyojinEndingSceneParam.IsShowMovie;
                        OnClickOption(m_button[(int)eButtonID.SHOW_MOVIE], ref showMovieFlg);
                        // ボタン押下SE再生
                        m_gSys.PlaySEActive();
                    };
                case eButtonID.SHOW_TIME:
                    return delegate(IScreen scr, ControlContext cc)
                    {
                        m_gSys.KyojinEndingSceneParam.IsShowTime = !m_gSys.KyojinEndingSceneParam.IsShowTime;
                        OnClickOption(m_button[(int)eButtonID.SHOW_TIME], ref showTimeFlg);
                        // ボタン押下SE再生
                        m_gSys.PlaySEActive();
                    };
                case eButtonID.SHOW_SCORE:
                    return delegate(IScreen scr, ControlContext cc)
                    {
                        m_gSys.KyojinEndingSceneParam.IsShowScore = !m_gSys.KyojinEndingSceneParam.IsShowScore;
                        OnClickOption(m_button[(int)eButtonID.SHOW_SCORE], ref showScoreFlg);
                        // ボタン押下SE再生
                        m_gSys.PlaySEActive();
                    };
                case eButtonID.START:
                    return delegate(IScreen scr, ControlContext cc)
                    {
                        m_gSys.DisableAllInputDevie();
                        endSceneEvent = delegate()
                        {
                            // タイトル画面ＢＧＭの終了
                            m_gSys.CommonBgmLoader.StopFade(0, 1000);

                            // すべてのスタックを破棄		
                            m_gSys.SceneController.ExitScene();
                            m_gSys.SceneController.JumpScene(Scenes.Ending);
                            m_gSys.EnableAllInputDevie();
                        };
                        alpha.Set(255, 0, 3);
                    };
                case eButtonID.BACK:
                    return delegate(IScreen scr, ControlContext cc)
                    {
                        endSceneEvent = delegate()
                        {
                            m_gSys.SceneController.ReturnScene();
                        };
                        m_gSys.PlaySystemSE((int)GameSystem.SYS_SE.CLICK_TITLE_NEGATIVE);
                        alpha.Set(255, 0, 3);
                    };
                default:
                    Debug.Assert(false);
                    break;
            }
            return null;
        }

        /// BGM OFF がクリックされたときの処理
        private void OnClickOption(FocusableTextureButton bt, ref bool flg)
        {
            if (null != bt)
            {
                if (!flg)
                {
                    bt.LoaderOffset += 1;
                    //bt.Enable = true;
                }
                else
                {
                    bt.LoaderOffset -= 1;
                    //bt.Enable = false;
                }
                flg = !flg;
            }
        }



        #endregion

    }
}
