package com.its.vds.xnettcp.vds.protocol.enums;

import java.util.HashMap;
import java.util.Map;

public enum eVdsOpCode {

    OP_VDS_SYNCHRONIZATION    (0x01, "0x01.제어기 동기화(Synchronization)"),     // 제어기 동기화 #1[0x01]                 SERVER→VDS, 응답없음.
    OP_VDS_DATA_TRAFFIC       (0x04, "0x04.VDS 데이터(교통)"),                   // 교통 data(교통량,점유율,차량길이,속도) SERVER→VDS
    OP_VDS_DATA_SPEED         (0x05, "0x05.VDS 데이터(속도)"),                   // 특정차로 속도 data,                    SERVER→VDS
    OP_VDS_DATA_LENGTH        (0x06, "0x06.VDS 데이터(차량길이)"),               // 특정차로 차량길이 data                 SERVER→VDS
    OP_VDS_DATA_VOLUME        (0x07, "0x07.VDS 데이터(누적교통량)"),             // 누적교통량 data                        SERVER→VDS
    OP_VDS_DATA_IMAGE         (0x16, "0x16.VDS 데이터(화상이미지)"),             // 로컬 이미지 data                       SERVER→VDS
    OP_VDS_DATA_VEHICLE       (0x17, "0x17.VDS 데이터(개별차량)"),               // 개별차량 data                          SERVER→VDS

    OP_VDS_STATUS_VALIDATION  (0x0B, "0x0B.제어기 상태(Validation)"),            // 로컬 H/W check 결과                    SERVER→VDS
    OP_VDS_STATUS_RESET       (0x0C, "0x0C.제어기 상태(Reset)"),                 // 제어기 리셋                            SERVER→VDS
    OP_VDS_STATUS_INITIALIZE  (0x0D, "0x0D.제어기 상태(Initialize)"),            // 제어기 Initialize                      SERVER→VDS
    OP_VDS_STATUS_RTC         (0x18, "0x18.제어기 상태(RTC)"),                   // RTC 변경                               SERVER→VDS
    OP_VDS_STATUS_TEMPERATURE (0x1E, "0x1E.제어기 상태(함체온도/입출력전압)"),   // 함체온도/입출력전압                    SERVER→VDS

    OP_VDS_PARAM_DOWNLOADING  (0x0E, "0x0E.제어기 파라미터(Downloading)"),       // 파라미터 Download                      SERVER→VDS
    OP_VDS_PARAM_UPLOADING    (0x0F, "0x0F.제어기 파라미터(Uploading)"),         // 파라미터 Upload                        SERVER→VDS

    OP_VDS_CHECK_ONLINE       (0x11, "0x11.VDS 원결진단(Online)"),               // 온라인 상태조사 Passed Time            SERVER→VDS
    OP_VDS_CHECK_MEMORY       (0x12, "0x12.VDS 원결진단(MEMORY)"),               // 메모리 Check                           SERVER→VDS
    OP_VDS_CHECK_ECHO         (0x13, "0x13.VDS 원결진단(ECHO)"),                 // Echo 메시지                            SERVER→VDS
    OP_VDS_CHECK_SEQUENCE     (0x14, "0x14.VDS 원결진단(SEQUENCE)"),             // 수치처리 결과값                        SERVER→VDS
    OP_VDS_CHECK_VERSION      (0x15, "0x15.VDS 원결진단(VERSION)"),              // version 정보                           SERVER→VDS

    OP_VDS_SET_TEMPERATURE    (0x20, "0x20.VDS 설정(Fan/Heater 동작온동)"),      // Fan/Heater 동작온도설정                SERVER→VDS

    OP_VDS_ACK                (0x70, "0x70.VDS ACK"),                            // VDS Acknowledge                         
    OP_VDS_NAK                (0x71, "0x71.VDS NAK"),                            // VDS Nacknowledge         
    OP_VDS_ABORT              (0x72, "0x72.Blank");                              // VDS Abort     

    private final int value;
    private final String string;

    private static final Map<Integer, eVdsOpCode> map;
    static {
        map = new HashMap<>();
        for (eVdsOpCode e : values()) {
            map.put(e.value, e);
        }
    }

    public static eVdsOpCode getValue(int value) {
        return map.get(value);
    }
    public static eVdsOpCode getValue(byte value) {
        int intValue = (value & 0xFF);
        return map.get(intValue);
    }

    eVdsOpCode(int value, String string) {
        this.value  = value;
        this.string = string;
    }

    public int getValue() {
        return this.value;
    }

    public byte getByteValue() {
        return (byte)(this.value & 0xFF);
    }

    @Override
    public String toString() {
        return this.string;
    }
}
