using Aitex.Core.RT.Log;
using MECF.Framework.Common.Communications;
using System;

namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Aligners.YaskawaAligner
{
    public abstract class YaskawaAlignerHandler : HandlerBase
    {
        public YaskawaAligner Device { get; }

        public string _commandType;
        public string _command;
        public string _parameter;
        private int _seqNO;

        public YaskawaAlignerHandler(YaskawaAligner device, string command, string parameter = null)
                : base(BuildMessage(command, parameter))
        {
            Device = device;
            _command = command;
            _parameter = parameter;
            Name = command;

        }
        protected static string BuildMessage(string command, string parameter)
        {
            if (string.IsNullOrEmpty(parameter))
                return command;
            return $"{command},{parameter}";



        }
        private static string Checksum(byte[] bytes)
        {
            int sum = 0;
            foreach (byte code in bytes)
            {
                sum += code;
            }
            string hex = String.Format("{0:X2}", sum % 256);
            return hex;
        }


        public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
        {
            YaskawaRobotMessage response = msg as YaskawaRobotMessage;
            ResponseMessage = msg;
            if (msg.IsError)
            {
                Device.OnError(response.RawMessage);
                transactionComplete = true;
                return true;
            }
            if (msg.IsAck)
            {
                SetState(EnumHandlerState.Acked);
            }

            if (response.IsComplete)
            {
                SetState(EnumHandlerState.Completed);
                Device.SenACK();
                Device.OnActionDone(null);
                transactionComplete = true;
                return true;
            }
            transactionComplete = false;
            return false;
        }


        protected virtual void NoteCommandResult(YaskawaRobotMessage response)
        {
        }


    }

    public class YaskawaAlignerReadHandler : YaskawaAlignerHandler
    {
        public YaskawaAlignerReadHandler(YaskawaAligner aligner, string command, string parameter = null)
            : base(aligner, command, parameter)
        {
            string temp = string.IsNullOrEmpty(parameter) ? parameter : "";
            LOG.Write($"{aligner.Name} execute read command {command} {temp} in ASCII.");
        }
        public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
        {
            YaskawaRobotMessage response = msg as YaskawaRobotMessage;

            if (Device.ParseReadData(_command, response.Data))
            {
                Device.OnActionDone(null);
                transactionComplete = true;
                return true;
            }
            response.IsError = true;
            return base.HandleMessage(response, out transactionComplete);
        }

    }
    public class YaskawaAlignerSetHandler : YaskawaAlignerHandler
    {
        public YaskawaAlignerSetHandler(YaskawaAligner pa, string command, string parameter = null)
            : base(pa, command, parameter)
        {
            string temp = string.IsNullOrEmpty(parameter) ? parameter : "";
            LOG.Write($"{pa.Name} execute set command {command} {temp} in ASCII.");
        }

        public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
        {
            YaskawaRobotMessage response = msg as YaskawaRobotMessage;
            if (response.IsComplete)
            {

                Device.OnActionDone(null);
                transactionComplete = true;
                return true;
            }
            return base.HandleMessage(response, out transactionComplete);
        }
    }

    public class YaskawaAlignerMotionHandler : YaskawaAlignerHandler
    {
        public YaskawaAlignerMotionHandler(YaskawaAligner pa, string command, string parameter = null)
           : base(pa, command, parameter)
        {
            string temp = string.IsNullOrEmpty(parameter) ? parameter : "";
            LOG.Write($"{pa.Name} execute motion command {command} {temp} in ASCII.");
        }
    }



}
