using System;
using System.Collections.Generic;
using System.Text;
using Kyojin.Model;
using Yamalib.Util;
using Yanesdk.Draw;
using Yanesdk.System;
using Yamalib;
using System.Diagnostics;
using Yamalib.Yanesdkext.Draw;
using Yamalib.Draw.Effect;

namespace Kyojin.Scene.EyeCatche
{

    /// <summary>
    /// 去人たちメインパートでシナリオ終了後のアイキャッチタスク
    /// TeopScenePramに遷移先シナリオ番号を指定すること
    /// </summary>
    class SenarioEndEyeCatcheScene : TaskBase, IDisposable
    {
        #region 定数値

        /// 下の DEF_FILES とあわせる（昔のための互換性）
        public enum SHI_TYPE : int
        {
            STD = 0,
            TOMIE01,
            ALICE01,
            ANZAI01,
            RUBI01,
            MIDO01,
            YUIRI01,
            AYA01,
        };

        /// 定義ファイル固定リスト
        private static readonly string[] DEF_FILES = new string[]
        {
    	    "img/eye/std/std.lst",
		    "img/eye/tomie/tomie01.lst",
		    "img/eye/alice/alice01.lst",
		    "img/eye/anzai/anzai01.lst",
		    "img/eye/rubi/rubi01.lst",
		    "img/eye/mido/mido01.lst",
		    "img/eye/yuiri/yuiri01.lst",
		    "img/eye/aya/aya01.lst",
	    };

        #endregion

        #region メンバフィールド

        private readonly GameSystem m_gSys;
        private SequenceDrawManager sdm;
        private bool init;
        private ITexture backup;
        private readonly RootCounterS phase = new RootCounterS();

        #endregion

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="gameSystem"></param>
        public SenarioEndEyeCatcheScene(GameSystem gameSystem)
        {
            m_gSys = gameSystem;
        }

        #region IDisposable メンバ

        public void Dispose()
        {
            YamalibUtility.Dispose(sdm);
            YamalibUtility.Dispose(backup);
        }

        #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)
            {
                onInit();
                m_gSys.Screen.BlendSrcAlpha();
                backup = m_gSys.EyeCatcheSceneParam.ScreenImg;
                init = true;
            }

            phase++;

            if (phase.IsEnd)
            {
                sdm.OnMove(m_gSys.Screen);

                if (sdm.IsFinish())
                {
                    if (!m_gSys.EyeCatcheSceneParam.JumpTitle)
                    {
                        // シナリオ画面へ
                        JumpScenario();
                        return 0;
                    }
                    else
                    {
                        // タイトル画面へ
                        JumpTitle();
                        return 0;
                    }
                }
            }
            return 1;
        }

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

            m_gSys.Screen.SetColor(255, 255, 255, 255);
            TransBltter.Blt(
                22,
                m_gSys.Screen,
                backup,
                0, 0,
                phase.Value()
            );

            if (phase.IsEnd)
            {
                sdm.OnDraw(m_gSys.Screen);
            }
        }

        /// 初期化処理
        private void onInit()
        {
            sdm = new SequenceDrawManager();

            // ３番目にいれてくれー
            int selNo = 0;

            if (m_gSys.EyeCatcheSceneParam.Pattern < DEF_FILES.Length)
            {
                selNo = m_gSys.EyeCatcheSceneParam.Pattern;
            }

            sdm.LoadDefFile(DEF_FILES[selNo]);
            phase.Set(255, 130, 2);
        }

        /// シナリオタスクに遷移する
        private void JumpScenario()
        {
            //m_gSys.selectedStory = sId;
            //// 強制バックアップを行う
            //m_gSys.gameSceneTransiter.setTransitType(GameSceneTransiter.C_NO_EFFECT, 1, true);
            //m_gSys.gameSceneTransiter.jumpScene(KyojinConst.Task.Task_Scenario);

            m_gSys.ScenarioSceneParam.IsReadTop = true;
            if (m_gSys.ScenarioSceneParam.ScenarioInfo == null)
            {
                m_gSys.ScenarioSceneParam.ScenarioInfo = new ScenarioInfo();
            }
            m_gSys.ScenarioSceneParam.ScenarioInfo.ScenarioID = m_gSys.EyeCatcheSceneParam.CallScenarioNo;


            // すべてのスタックを破棄		
            m_gSys.SceneController.ExitScene();
            m_gSys.SceneController.CallScene(Scenes.Scenario);
        }

        /// シナリオタスクに遷移する
        private void JumpTitle()
        {
            // すべてのスタックを破棄		
            m_gSys.SceneController.ExitScene();

            // 強制バックアップを行う
            m_gSys.SceneController.CallScene(Scenes.Startmenu);
        }

    }
}
