using AwInitilizer.Model;
using MesAdaptor;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AwInitilizer.Converter
{
    public static class MesErrorCodeMaper
    {
        public static MesErrorCode GetMesErrorCode(Procedure.ProcedureBase procedure)
        {
            switch(procedure.GetType().Name)
            {
                case "BasicInfoUpdateProcedure":
                    return GetMesErrorCode((Procedure.BasicInfoUpdate.BasicInfoUpdateProcedure)procedure);
                case "FourGenModuleCheckProcedure":
                    return GetMesErrorCode((Procedure.FourGenModuleCheck.FourGenModuleCheckProcedure)procedure);
                case "WifRssiCheckProcedure":
                    return GetMesErrorCode((Procedure.WifRssiCheck.WifRssiCheckProcedure)procedure);
                case "FirmwareBundleUploadProcedure":
                    return GetMesErrorCode((Procedure.FirmwareBundleUpload.FirmwareBundleUploadProcedure)procedure);
                case "FirmwareCheckVersionProcedure":
                    return GetMesErrorCode((Procedure.FirmwareCheckVersion.FirmwareCheckVersionProcedure)procedure);
                case "ButtonStatusCheckPorcedure":
                    return GetMesErrorCode((Procedure.ButtonStatusCheck.ButtonStatusCheckPorcedure)procedure);
                case "RestarttoIdleProcedure":
                    return GetMesErrorCode((Procedure.RestarttoIdle.RestarttoIdleProcedure)procedure);
                case "VersionLogProcedure":
                    return GetMesErrorCode((Procedure.VersionLog.VersionLogProcedure)procedure);
                case "MacAddressLogProcedure":
                    return GetMesErrorCode((Procedure.MacAddressLog.MacAddressLogProcedure)procedure);
                case "NetworkInterfaceSetupProcedure":
                    return GetMesErrorCode((Procedure.NetworkInterfaceSetup.NetworkInterfaceSetupProcedure)procedure);
                default:
                    return MesErrorCode.None;
            }
        }

        public static MesErrorCode GetMesErrorCode(Procedure.BasicInfoUpdate.BasicInfoUpdateProcedure procedure)
        {
            switch(procedure.Error)
            {
                case Procedure.BasicInfoUpdate.ErrorType.EvseConnectFail:
                case Procedure.BasicInfoUpdate.ErrorType.SettingSaveFail:
                case Procedure.BasicInfoUpdate.ErrorType.RestartConnectFail:
                    return MesErrorCode.ChargerConnectFail;
                case Procedure.BasicInfoUpdate.ErrorType.ModelNameWriteFail:
                case Procedure.BasicInfoUpdate.ErrorType.ModelNameGetFail:
                case Procedure.BasicInfoUpdate.ErrorType.ModelNameMismach:
                    return MesErrorCode.ModelNameUpadateFail;
                case Procedure.BasicInfoUpdate.ErrorType.SerialNumberWriteFail:
                case Procedure.BasicInfoUpdate.ErrorType.SerialNumberGetFail:
                case Procedure.BasicInfoUpdate.ErrorType.SerialNumberMismach:
                    return MesErrorCode.ModelNameUpadateFail;
                case Procedure.BasicInfoUpdate.ErrorType.RtcUpdateFail:
                case Procedure.BasicInfoUpdate.ErrorType.UtcTimeMismatch:
                    return MesErrorCode.ModelNameUpadateFail;
            }
            return MesErrorCode.None;
        }

        public static MesErrorCode GetMesErrorCode(Procedure.FourGenModuleCheck.FourGenModuleCheckProcedure procedure)
        {
            switch(procedure.Error)
            {
                case Procedure.FourGenModuleCheck.ErrorType.ConnectFail:
                case Procedure.FourGenModuleCheck.ErrorType.VersionReadFail:
                case Procedure.FourGenModuleCheck.ErrorType.SimStatusReadFail:
                    return MesErrorCode.ChargerConnectFail;
                case Procedure.FourGenModuleCheck.ErrorType.VersionMismatch:
                    return MesErrorCode.FourthGenModelVersionMismatch;
                case Procedure.FourGenModuleCheck.ErrorType.SimStatusMismatch:
                    return MesErrorCode.FourthGenSimInstartionMismatch;
                case Procedure.FourGenModuleCheck.ErrorType.IccidMistach:
                case Procedure.FourGenModuleCheck.ErrorType.ImsiMistach:
                    return MesErrorCode.FourthGenSimInfoMismatch;
            }
            return MesErrorCode.None;
        }

        public static MesErrorCode GetMesErrorCode(Procedure.WifRssiCheck.WifRssiCheckProcedure procedure)
        {
            switch(procedure.Error)
            {
                case Procedure.WifRssiCheck.ErrorType.WifiModeDataNotFound:
                case Procedure.WifRssiCheck.ErrorType.WifiRssiDataNotFound:
                    return MesErrorCode.ChargerConnectFail;
                case Procedure.WifRssiCheck.ErrorType.WifiModeNotClient:
                    return MesErrorCode.WifiModeNotClient;
                case Procedure.WifRssiCheck.ErrorType.WifiRssiLow:
                    return MesErrorCode.WifiRssiLow;
            }
            return MesErrorCode.None;
        }

        public static MesErrorCode GetMesErrorCode(Procedure.FirmwareBundleUpload.FirmwareBundleUploadProcedure procedure)
        {
            switch(procedure.Error)
            {
                case Procedure.FirmwareBundleUpload.ErrorType.StartWaitTimeout:
                case Procedure.FirmwareBundleUpload.ErrorType.UploadFailed:
                case Procedure.FirmwareBundleUpload.ErrorType.SignalUpdateFailed:
                    return MesErrorCode.FirmwareUploadFail;
            }
            return MesErrorCode.None;
        }

        public static MesErrorCode GetMesErrorCode(Procedure.FirmwareCheckVersion.FirmwareCheckVersionProcedure procedure)
        {
            switch(procedure.Error)
            {
                case Procedure.FirmwareCheckVersion.ErrorType.RestartTimeout:
                    return MesErrorCode.FirmwareUpdateTimeout;
                case Procedure.FirmwareCheckVersion.ErrorType.VersionCheckFail:
                    return MesErrorCode.FirmwareVersionCheckFail;
            }
            return MesErrorCode.None;
        }

        public static MesErrorCode GetMesErrorCode(Procedure.ButtonStatusCheck.ButtonStatusCheckPorcedure procedure)
        {
            switch(procedure.Error)
            {
                case Procedure.ButtonStatusCheck.ErrorType.ConnectFail:
                case Procedure.ButtonStatusCheck.ErrorType.GetStatusFail:
                    return MesErrorCode.ChargerConnectFail;
                case Procedure.ButtonStatusCheck.ErrorType.FirstButtonCheckFail:
                    return MesErrorCode.GreenButtonTestFail;
                case Procedure.ButtonStatusCheck.ErrorType.SecondButtonCheckFail:
                    return MesErrorCode.BlueButtonTestFail;
                case Procedure.ButtonStatusCheck.ErrorType.ThirdButtonCheckFail:
                    return MesErrorCode.BlueButtonTestFail;
                case Procedure.ButtonStatusCheck.ErrorType.EmergencyButtonCheckFail:
                    return MesErrorCode.EmergencyButtonTestFail;
            }
            return MesErrorCode.None;
        }

        public static MesErrorCode GetMesErrorCode(Procedure.RestarttoIdle.RestarttoIdleProcedure procedure)
        {
            switch(procedure.Error)
            {
                case Procedure.RestarttoIdle.ErrorType.SetFail:
                case Procedure.RestarttoIdle.ErrorType.ConnectorNotIdle:
                    return MesErrorCode.FactoryResetFail;
            }
            return MesErrorCode.None;
        }

        public static MesErrorCode GetMesErrorCode(Procedure.VersionLog.VersionLogProcedure procedure)
        {
            if (procedure.Error == Procedure.VersionLog.VersionLogProcedure.ErrorType.ReadVersionFail)
                return MesErrorCode.ChargerConnectFail;
            return MesErrorCode.None;
        }

        public static MesErrorCode GetMesErrorCode(Procedure.MacAddressLog.MacAddressLogProcedure procedure)
        {
            if (procedure.Error == Procedure.MacAddressLog.MacAddressLogProcedure.ErrorType.ReadNetworkFail)
                return MesErrorCode.ChargerConnectFail;
            return MesErrorCode.None;
        }

        public static MesErrorCode GetMesErrorCode(Procedure.NetworkInterfaceSetup.NetworkInterfaceSetupProcedure procedure)
        {
            if (procedure.Error == Procedure.NetworkInterfaceSetup.ErrorType.WiFiSetFailed)
                return MesErrorCode.WifiModeNotClient;
            if (procedure.Error == Procedure.NetworkInterfaceSetup.ErrorType.TelcomSetFailed)
                return MesErrorCode.FourthGenSimInfoMismatch;
            if (procedure.Error == Procedure.NetworkInterfaceSetup.ErrorType.RestartFailed)
                return MesErrorCode.FactoryResetFail;
            return MesErrorCode.None;
        }
    }
}