using System;
using System.Collections.Generic;
using System.Text;

namespace ENIGProtocol
{
    /// <summary>
    /// host -> eq
    /// </summary>
    public enum AGVCommandHE : byte
    {
        Goto = 100,
        Stop = 101,
        Reset = 102,
        SetCurrent = 103,
        Manual = 104,
        MarkStop = 105,
        LiftControl = 106,
        GotoAlias = 107,
        AutoMove = 108,
        ChargeControl = 109,
        Charger = 112,
        LTurn = 113,
        RTurn = 114,
        LTurn180 = 115,
        RTurn180 = 116,
        PickOnEnter = 117,
        PickOffEnter = 118,
        PickOnExit = 119,
        PickOffExit = 120,
    }

    /// <summary>
    /// eq -> host
    /// </summary>
    public enum AGVCommandEH : byte
    {
        Error = 1,
        Arrived = 2,
        ReadRFID = 3,
        ActionComplete=4,
        Status = 9,
    }

    public enum AGVErrorCode : byte
    {
        None = 0,
        PredictFix,
        TurnTimeout,
        TurnError,
        EmptyNode,
        Goto,
        ManualMode,
        UnknownCommand,
        UnknownAlias,

        // Operational Errors
        CART_EXIST,
        MARK_TIMEOUT,
        MARK_SENSOR_FAIL,        
        LIFT_ERROR,        
        AGV_SPEED_SET_FAIL,
        AGV_RUN_FAIL,
        AGV_STOP_FAIL,
        PATH_INTEGRITY_FAIL,
        TURN_FAIL,
        NO_CHARGEPOINT,
        NOTSET_CHARGEPOINT,
        ALREADY_CHARGE,
        CHARGE_RETRY_OVER,
        MAGNET_ON_ERROR,
        MAGNET_OF_ERROR,
        BUFFER_NOT_COMPLETE,
        MARK_STOP_FAIL,
        LIDAR_STOP,
        NOT_BUFFERPOINT,
        NOT_EQUIPMENTPOINT,
        PATH_COMPLETE_INTEGRITY_FAIL,
        UPDATEMOTION_TIMEOUT
    }

    public static class AGVUtility
    {
        /// <summary>
        /// 에러코드에 해당하는 오류메세지를 반환 합니다
        /// </summary>
        /// <param name="ecode"></param>
        /// <returns></returns>
        public static string GetAGVErrorMessage(AGVErrorCode ecode)
        {
            switch (ecode)
            {
                case AGVErrorCode.None: return "No Error";
                case AGVErrorCode.PredictFix: return "이동 예측이 동작하지 않습니다";
                case AGVErrorCode.TurnTimeout: return "회전작업 시간초과";
                case AGVErrorCode.TurnError: return "회전작업이 완료되지 않았습니다";
                case AGVErrorCode.EmptyNode: return "노드정보를 찾을 수 없습니다";
                case AGVErrorCode.Goto: return "이동 명령 오류";
                case AGVErrorCode.ManualMode: return "자동운전 상태가 아닙니다";
                case AGVErrorCode.UnknownCommand: return "알수 없는 명령입니다";
                case AGVErrorCode.UnknownAlias: return "알수 없는 별칭 입니다";

                case AGVErrorCode.CART_EXIST: return "카트 감지 센서 오류";
                case AGVErrorCode.MARK_TIMEOUT: return "마크 정지 신호 시간초과";
                case AGVErrorCode.MARK_SENSOR_FAIL: return "마크 센서 미감지";
                case AGVErrorCode.LIFT_ERROR: return "리프트 동작 오류";
                case AGVErrorCode.AGV_SPEED_SET_FAIL: return "AGV 속도 설정 실패";
                case AGVErrorCode.AGV_RUN_FAIL: return "AGV 구동 실패";
                case AGVErrorCode.AGV_STOP_FAIL: return "AGV 정지 실패";
                case AGVErrorCode.PATH_INTEGRITY_FAIL: return "경로 무결성 검증 실패";
                case AGVErrorCode.TURN_FAIL: return "턴 동작 실패";
                case AGVErrorCode.NO_CHARGEPOINT: return "충전 위치 아님";
                case AGVErrorCode.NOTSET_CHARGEPOINT: return "충전기 노드 미설정";
                case AGVErrorCode.ALREADY_CHARGE: return "이미 충전 중 상태임";
                case AGVErrorCode.CHARGE_RETRY_OVER: return $"충전명령 재전송 횟수 초과";
                case AGVErrorCode.NOT_BUFFERPOINT: return "현재 위치가 버퍼가 아닙니다";
                case AGVErrorCode.NOT_EQUIPMENTPOINT: return "현재 위치가 장비 노드가 아닙니다";
                case AGVErrorCode.PATH_COMPLETE_INTEGRITY_FAIL: return "목적지 도착 완료 했으나 노드 혹은 방향이 일치지하지 않습니다";
                default: return ecode.ToString();

            }
        }
    }

}
