using Aitex.Core.Common;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using CyberX8_Core;

namespace CyberX8_RT
{
    public enum CommunicationType { Analogue, RS232, Ethernet }
    //public enum BusyFlag { Idle, Busy, Error }

    public enum OnlineFlag { Offline, Online }

    public enum AutoFlag { Manual, Auto }

    public enum ActionStatus
    {
        Unknown, Pending, SendCmd, RecACK, RecINF, Completed, PartialDone, AllCompleted, Timeout, Error, Cancel
    }

    public enum LightType
    {
        RED, BLUE, GREEN, YELLOW, WHITE, BUZZER1
    }

    public enum LightStatus
    {
        OFF, ON, BLINK
    }

    public class Position
    {
        public ModuleName Module { get; set; }
        public byte Slot { get; set; }
    }

    public enum ExtendPos
    {
        //GetReady, GetTarget, GetBack, PutReady, PutTarget, PutBack
        G1, GB, G4, P1, PB, P4
    }

    /// <summary>
    /// Wafer transferring argument
    /// </summary>
    class MoveParam
    {
        public Position SrcPos { get; } = new Position();
        public Position DestPos { get; } = new Position();

        public ModuleName SrcModule     => SrcPos.Module;
        public byte SrcSlot             => SrcPos.Slot;
        public ModuleName DestModule    => DestPos.Module;
        public byte DestSlot            => DestPos.Slot;

        public WaferSize WaferSize { get; set; }
        public Hand Arm { get; }

        public MoveParam(Position src, Position dest)
        {
            this.SrcPos = src; this.DestPos = dest;
        }

        public MoveParam(ModuleName srcMod, byte srcSlot, ModuleName destMod, byte destSlot, Hand arm, WaferSize ws)
        {
            SrcPos.Module = srcMod;
            SrcPos.Slot = srcSlot;
            DestPos.Module = destMod;
            DestPos.Slot = destSlot;
            Arm = arm;
            WaferSize = ws;
        }

        public MoveParam(int p0, int p1, int p2, int p3, int arm, int ws)
        {
            SrcPos.Module = (ModuleName)p0;
            SrcPos.Slot   = (byte)p1;
            SrcPos.Module = (ModuleName)p2;
            SrcPos.Slot   = (byte)p3;
            Arm           = (Hand)arm;
            WaferSize     = (WaferSize)ws;
        }
    }

    class SwapParam
    {
        public Position SrcPos { get; } = new Position();
        public Position DestPos { get; } = new Position();

        public ModuleName SrcModule => SrcPos.Module;
        public byte SrcSlot => SrcPos.Slot;
        public ModuleName DestModule => DestPos.Module;
        public byte DestSlot => DestPos.Slot;

        public WaferSize WaferSize { get; set; }
        public Hand Arm { get; }

        public SwapParam(Position src, Position dest)
        {
            this.SrcPos = src; this.DestPos = dest;
        }

        public SwapParam(ModuleName srcMod, byte srcSlot, ModuleName destMod, byte destSlot, Hand arm, WaferSize ws)
        {
            SrcPos.Module = srcMod;
            SrcPos.Slot = srcSlot;
            DestPos.Module = destMod;
            DestPos.Slot = destSlot;
            Arm = arm;
            WaferSize = ws;
        }

        public SwapParam(int p0, int p1, int p2, int p3, int arm, int ws)
        {
            SrcPos.Module = (ModuleName)p0;
            SrcPos.Slot = (byte)p1;
            SrcPos.Module = (ModuleName)p2;
            SrcPos.Slot = (byte)p3;
            Arm = (Hand)arm;
            WaferSize = (WaferSize)ws;
        }
    }
    class ExtendParam
    {
        public ModuleName Module { get; set; }
        public ExtendPos Pos { get; set; }
        public Hand Arm { get; set; } = Hand.Blade1;
    }

    static class Extension
    {
        public static MovePath Path(this MoveParam mp)
        {
            return MovePath.LPToPM;
        }
    }

    enum MovePath
    {
        LPToPM,
        PMToLP
    }

    public interface IHardwareMessage
    {
        string RawString { get; set; }
    }


    public enum GeneratorMFG
    {
        AdTec = 1,
        Comet = 2
    }

    public enum MatchMFG
    {
        AdTec =1,
        Comet = 2,
        Revtech=3
    }

    public enum ChillerMFG
    {
        SMC = 1,
        AIRSYS = 2,
    }

    public enum DryPumpMFG
    {
        SKY = 1,
        Edwards = 2,
        Kashiyama = 3
    }

    public enum MsgDirection
    {
        Unknown, To, From
    }

}