using MECF.Framework.Simulator.Core.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
namespace Venus_Simulator.Devices
{
    public class VceSimulator : SerialPortDeviceSimulator
    {
        private const string EOF = "\r";
        private const char MSG_DELIMITER = ' ';
        private const string VCE_Port = "COM161";
        private Regex _action_rule = new Regex(@"\d\d,A,.*");
        private Regex _read_rule = new Regex(@"\d\d,R,.*");
        private Regex _set_rule = new Regex(@"\d\d,S,.*");
        private Regex _curing_rule = new Regex(@"\d\d,P,.*");
        private int currentSlot = 0;
        private string mapresult = "XXXXXXXXXX,XXXXXXXXXX,XXXXX?????,??????????";
        /// 
        /// 用以模拟扫片结果
        /// 
        /// 
        public void Wafermap(bool isempty)
        {
            if(isempty)
                mapresult = "0000000000,0000000000,00000?????,??????????";
            else
                mapresult = "XXXXXXXXXX,XXXXXXXXXX,XXXXX?????,??????????";
        }
        public VceSimulator(string port) : base(port, -1, EOF, MSG_DELIMITER)
        {
        }
        protected override void ProcessUnsplitMessage(string message)
        {
            if (string.IsNullOrEmpty(message))
                throw new ArgumentException("Hardware command message is invalid");
            if (message.Contains(EOF))
            {
                message = message.Trim();
            }
            if (_action_rule.IsMatch(message) || _set_rule.IsMatch(message) || _curing_rule.IsMatch(message))
            {
                OnWriteMessage("_RDY" + EOF);
                Thread.Sleep(2000);
                OnWriteMessage("_BKGRDY" + EOF);
                if (message.Contains("00,A,GO"))
                    currentSlot = Convert.ToInt32(message.Split(',')[3]);
                return;
            }
            if (_read_rule.IsMatch(message))
            {
                switch (message)
                {
                    case "00,R,MI":
                        OnWriteMessage("00,X,MI,1,0,A,3,0,0,0,0,0,0" + EOF);
                        Thread.Sleep(2000);
                        OnWriteMessage("_RDY" + EOF);
                        return;
                    case "00,R,MI,S":
                        OnWriteMessage("00,X,MI,"+ mapresult + EOF);
                        //OnWriteMessage("00,X,MI,0000000000,0000000000,XXXXX?????,??????????" + EOF);
                        Thread.Sleep(2000);
                        OnWriteMessage("_RDY" + EOF);
                        return;
                    case "00,R,OS":
                        OnWriteMessage($"00,X,OS,BRR,SL{currentSlot.ToString().PadLeft(2,'0')},CPNN,WPYY,ERN" + EOF);
                        //OnWriteMessage("00,X,MI,0000000000,0000000000,XXXXX?????,??????????" + EOF);
                        Thread.Sleep(2000);
                        OnWriteMessage("_RDY" + EOF);
                        return;
                    default:
                        return;
                }
            }
            //string[] strs = message.Split(MSG_DELIMITER);
            //Thread.Sleep(2 * 1000);
        }
    }
}