using System;
using System.Collections.Generic;
using System.Text;
using Yanesdk.Draw;
using Yamalib.Util;

namespace Kyojintachi.src.yamalib.draw
{

    /// <summary>
    /// プロンプトカーソル描画クラス
    /// 仮想のプロンプトカーソルを描画
    /// 表示状態から描画開始し、カーソルの残像も描画します。
    /// </summary>
    public class PromptCarsor
    {
        #region メンバフィールド

        private ITexture carsor;		//!< カーソル画像
        private int x;
        private int y;			//!< 描画位置
        private int blink;			//!< 点滅速度
        private int dispflame;		//!< 表示フレーム数
        private int nondispflame;	//!< 非表示フレーム数
        private bool blend;			//!< ブレンドするか
        private bool disp;			//!< 表示中か

        private RootCounter alpha;
        private int flamecounter;
        private int dispcounter;

        #endregion

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public PromptCarsor()
        {
            blink = 20;
            dispflame = 5;
            nondispflame = 5;
            blend = true;
            disp = true;
            alpha = new RootCounter();
            alpha.ReverseFlg = (true);
            alpha.Set(0, 255, 1);
            calcAlphaStep();
            alpha.opAssign(255);
        }

        /// プロンプトカーソル用のテクスチャを設定します
        /*
            これを設定しなければ、内部で白いテクスチャを生成し、それを使用する
        */
        public void SetTexture(ITexture t) { carsor = t; }

        /// 明滅の１周期フレーム数
        public void SetBlinkSpeed(int speed)
        {
            blink = speed;
        }

        /// 明滅周期中のカーソルを完全表示(α=255)表示時間
        public void SetDispFlame(int flame)
        {
            if (flame > blink)
            {
                dispflame = blink;
            }
            else
            {
                dispflame = flame;
            }
        }

        /// 周期中の中で、プロンプトカーソルが表示されていないフレーム数の設定
        public void SetNonDispFlame(int flame)
        {
            nondispflame = flame;
        }

        /// 表示位置の設定
        public void SetXY(int x_, int y_)
        {
            x = x_;
            y = y_;
        }

        /// 表示位置の取得
        public void GetXY(out int x_, out int y_)
        {
            x_ = x;
            y_ = y;
        }

        /// ブレンドするか
        public void SetBlend(bool b) { blend = b; }

        /// 状態を初期化
        public void Seset()
        {
            flamecounter = 0;
        }

        /// 毎回呼び出す
        public void OnPaint(IScreen screen)
        {
            if (carsor == null) return;

            if (!disp)
            {
                dispcounter++;
                if (dispcounter >= nondispflame)
                {
                    disp = true;
                    dispcounter = 0;
                }
                return;
            }

            if (flamecounter < dispflame)
            {
                screen.BlendAddColorAlpha();
                screen.Blt(carsor, x, y);
            }
            else
            {
                alpha++;
                if (blend)
                {
                    screen.BlendAddColorAlpha();
                    screen.SetColor(255, 255, 255, alpha.Value());
                    screen.Blt(carsor, x, y);
                }
                else
                {
                }
            }

            // 使ったら元に戻しとけ
            screen.ResetColor();

            flamecounter++;

            if (flamecounter >= blink)
            {
                flamecounter = 0;
                alpha.Reset();
                alpha.opAssign(255);
                //			disp = false;
            }
        }

        #region 非公開メンバ

        private void calcAlphaStep()
        {
            int n = blink - dispflame;
            int step = 255 / n;
            alpha.StepValue = (step);
        }


        #endregion

    }
}
