using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

using FLY.Thick.Base.Common;

namespace FLY.Thick.Base.Server
{
    /// <summary>
    /// 设备模式, 
    /// 如:
    /// GM_Origin 归原点
    /// GM_Stop 停止
    /// GM_Backw 后退
    /// GM_Forw 前进
    /// GM_Goto 执行运行指令
    /// GM_Fix 定点
    /// GM_Scan 扫描
    /// GM_ScanCorr 机架修正
    /// GM_SyncScan 同步
    /// GM_GetSample 样品取样
    /// GM_RenZiJiaScan 吹膜.扫描
    /// GM_RenZiJiaFix 吹膜.定点
    /// </summary>
    public interface IGageMode:INotifyPropertyChanged
    {
        /// <summary>
        /// 对应的运行模式枚举
        /// </summary>
        CTRL_STATE GMState { get; }
        /// <summary>
        ///  运行中
        /// </summary>
        bool IsRunning { get; }
        /// <summary>
        /// 开始
        /// </summary>
        /// <returns></returns>
        void Start();
        /// <summary>
        /// 停止
        /// </summary>
        void Stop();
    }
    /// <summary>
    /// 设备模式管理器
    /// 当 GM_XXX.Start() 。后,  GageModeManager 收到通知,
    /// GageModeManager再通知其它GM_XXXn.Stop()
    /// 当 GM_XXX 自己停下来 Stop(), 
    /// GageModeManager 要确保 有一个 设备模式 在 运行
    /// 
    /// </summary>
    public class GageModeManager:INotifyPropertyChanged 
    {
        /// <summary>
        /// 当前动作模式
        /// </summary>
        public CTRL_STATE State { get; set; } = CTRL_STATE.FIX;

        /// <summary>
        /// 第1个GM,就是默认值
        /// </summary>
        List<IGageMode> GMs = new List< IGageMode>();

        /// <summary>
        /// 正在运行的GM
        /// </summary>
        IGageMode GMofRunning=null;

        /// <summary>
        /// 运行模式管理器
        /// </summary>
        public GageModeManager() 
        {

        }
        /// <summary>
        /// 添加到运行模式队列
        /// </summary>
        /// <param name="gm"></param>
        public void AddGM(IGageMode gm) 
        {
            GMs.Add(gm);
            gm.PropertyChanged += gm_PropertyChanged;
        }

        void gm_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            IGageMode gm = sender as IGageMode;

            if (e.PropertyName == "IsRunning") 
            {
                if (gm.IsRunning == true)
                {
                    //GM 启动
                    if (GMofRunning != null)//其中一个GM启动,停止上一次运行的GM
                    {
                        IGageMode g = GMofRunning;
                        GMofRunning = gm;
                        g.Stop();
                    }
                    else
                    {
                       
                        GMofRunning = gm;
                    }
                    //更新当前状态
                    State = gm.GMState;
                }
                else 
                {
                    //GM 停止
                    if (gm == GMofRunning) 
                    {
                        GMofRunning = null;//当前没有GM在运行

                        GMs[0].Start();//停止的GM,是当前运行的,启动默认GM
                    }
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}