using Aitex.Core.RT.Device;
using Aitex.Core.RT.Event;
using Aitex.Core.Util;
using Aitex.Sorter.Common;
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.TDK
{
    public class QueryStateHandler : IMsg
    {
        /// 
        /// / (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20)
        /// (1) Equipment status 0 = Normal A = Recoverable error E = Fatal error
        ///(5)Error code Error code(upper)
        ///(6)Error code Error code(lower)
        ///(7)Cassette presence 0 = None 1 = Normal position 2 = Error load
        ///(8)FOUP clamp status 0 = Open 1 = Close? = Not defined
        ///(11)Door position 0 = Open position 1 = Close position ? = Not defined
        /// 
        public bool background { get; private set; }
        public string deviceID { private get; set; }
        private string _cmd = string.Empty;
        public QueryStateHandler()
        {
            background = false;
        }
        public string package(params object[] args)
        {
            _cmd = QueryType.STATE.ToString();
            return string.Format("GET:{0}", _cmd);
        }
        public string retry()
        {
            return string.Format("RFN:{0}", _cmd);
        }
        public bool unpackage(string type, string[] items)
        {
            if (!type.Equals("ACK"))
                return false;
            string state = items[1];
            TDKLoadPort device = DEVICE.GetDevice(deviceID);
            device.ErrorCode = state.Substring(4, 2);
            if (state[0] != '0')
            {
                device.Error = true;
                device.ErrorCode = state.Substring(4,2);
                string error = Singleton.Instance.Code2Msg(device.ErrorCode);
                EV.PostMessage(deviceID, EventEnum.DefaultWarning, string.Format("{0} has error, error is {1}", deviceID, error));
            }
            else
            {
                device.Error = false; 
            }
         
            device.SetCassetteState(getCassetteState(state[6]));  
            device.ClampState = getClampState(state[7]);
         device.DoorState = getDoorState(state[10]);
            string reason = string.Empty;            
            device.OnStateUpdated();
            return true;
        }
        public bool canhandle(string id)
        {
            return id.Equals(_cmd);
        }
        //(7) Cassette presence 0 = None 1 = Normal position 2 = Error load
        private LoadportCassetteState getCassetteState(char x)
        {
            if (x == '0')
                return LoadportCassetteState.None;
            if (x == '1')
                return LoadportCassetteState.Normal;
            return LoadportCassetteState.Unknown;
        }
        //    (8) FOUP clamp status 0 = Open 1 = Close ? = Not defined
        private FoupClampState getClampState(char x)
        {
            if (x == '0')
                return FoupClampState.Open;
            if (x == '1')
                return FoupClampState.Close;
            return FoupClampState.Unknown;
        }
        //(11) Door position 0 = Open position 1 = Close position ? = Not defined
        private FoupDoorState getDoorState(char x)
        {
            if (x == '0')
                return FoupDoorState.Open;
            if (x == '1')
                return FoupDoorState.Close;
            return FoupDoorState.Unknown;
        }
    }
    public class QueryIndicatorHandler : IMsg
    {
        public bool background { get; private set; }
        public string deviceID { private get; set; }
        private string _cmd = string.Empty;
        public QueryIndicatorHandler()
        {
            background = false;
        }
        public string package(params object[] args)
        {
            _cmd = QueryType.LEDST.ToString();
            return string.Format("GET:{0}", _cmd);
        }
        public string retry()
        {
            return string.Format("RFN:{0}", _cmd);
        }
        public bool unpackage(string type, string[] items)
        {
            if (!type.Equals("ACK"))
                return false;
            string state = items[1];
            TDKLoadPort device = DEVICE.GetDevice(deviceID);
            if (state.Length == 7)
            {
                device.IndicatiorPresence = getIndicatorState(state[0]);
                device.IndicatiorPlacement = getIndicatorState(state[1]);
                device.IndicatorAlarm = getIndicatorState(state[2]);
                device.IndicatiorLoad = getIndicatorState(state[3]);
                device.IndicatiorUnload = getIndicatorState(state[4]);
                device.IndicatiorOpAccess = getIndicatorState(state[5]);
                device.IndicatiorStatus1 = getIndicatorState(state[6]);
            }
            else
            {
                device.IndicatiorLoad = getIndicatorState(state[0]);
                device.IndicatiorUnload = getIndicatorState(state[1]);
                device.IndicatiorOpAccess = getIndicatorState(state[2]);
                device.IndicatiorPresence = getIndicatorState(state[3]);
                device.IndicatiorPlacement = getIndicatorState(state[4]);
                device.IndicatorAlarm = getIndicatorState(state[5]);
                device.IndicatiorStatus1 = getIndicatorState(state[6]);
                device.IndicatiorStatus2 = getIndicatorState(state[7]);
            }
            return true;
        }
        public bool canhandle(string id)
        {
            return id.Equals(_cmd);
        }
        private IndicatorState getIndicatorState(char x)
        {
            if (x == '0')
                return IndicatorState.OFF;
            if (x == '1')
                return IndicatorState.ON;
            return IndicatorState.BLINK;
        }
    }
    
    public class QueryWaferMappingHandler : IMsg
    {
        public bool background { get; private set; }
        public string deviceID { private get; set; }
        private string _cmd = string.Empty;
        public QueryWaferMappingHandler()
        {
            background = false;
        }
        public string package(params object[] args)
        {        
            _cmd = QueryType.MAPRD.ToString();
            return string.Format("GET:{0}", _cmd);
        }
        public string retry()
        {
            return string.Format("RFN:{0}", _cmd);
        }
        public bool unpackage(string type, string[] items)
        {
            if (!type.Equals("ACK"))
                return false;
            TDKLoadPort device = DEVICE.GetDevice(deviceID);
            device.OnSlotMapRead(items[1]);
            string reason = string.Empty;
            device.QueryState(out reason);
        
            return true;
        }
        public bool canhandle(string id)
        {
            return id.Equals(_cmd);
        }
    }
    /// 
    /// 查询FOSB模式是否激活
    /// 
    public class QueryFOSBModeHandler : IMsg
    {
        public bool background { get; private set; }
        public string deviceID { private get; set; }
        private string _cmd = string.Empty;
        public QueryFOSBModeHandler()
        {
            background = false;
        }
        public string package(params object[] args)
        {
            _cmd = QueryType.FSBxx.ToString();
            return string.Format("GET:{0}", _cmd);
        }
        public string retry()
        {
            return string.Format("RFN:{0}", _cmd);
        }
        public bool unpackage(string type, string[] items)
        {
            if (!type.Equals("ACK"))
                return false;
            string modeState = items[1];
            TDKLoadPort device = DEVICE.GetDevice(deviceID);
            switch (modeState)
            {
                case "ON":
                    device.IsFOSBMode = true;
                    break;
                case "OF":
                    device.IsFOSBMode = false;
                    break;
                default:
                    device.IsFOSBMode = false;
                    break;
            }
            return true;
        }
        
        public bool canhandle(string id)
        {
            return id.Equals(_cmd);
        }
        
    }
}