using Edge.Core.Parser.BinaryParser.MessageEntity;
using Edge.Core.Parser.BinaryParser.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Edge.Core.Parser.BinaryParser.Util;

namespace ShengJu_CUT100_DES.MessageEntity
{
    public enum CommandType
    {
        保留0x11 = 0x11,
        保留0x12 = 0x12,
        保留0x13 = 0x13,
        /// <summary>
        /// 通过 INT 引脚可以输出控制信号
        /// </summary>
        通用命令_控制LED闪烁 = 0x14,
        /// <summary>
        /// 返回模块版本 ASCII 码信息
        /// </summary>
        通用命令_读取模块信息 = 0x15,

        /// <summary>
        /// 此命令可以读取 A 型卡卡号
        /// </summary>
        通用命令_A型卡激活 = 0x16,
        /// <summary>
        /// 此命令可以读取 B 型卡卡号(仅 CUT-200系列读卡模块支持)
        /// </summary>
        通用命令_RC523_B型卡激活 = 0x17,
        /// <summary>
        /// 后续可以进行 APDU 命令操作
        /// </summary>
        通用命令_激活卡片到ISO1443_4 = 0x18,
        /// <summary>
        /// 数据透传命令,支持自定义开发 CPU 卡
        /// </summary>
        通用命令_CPU卡数据透传APDU = 0x19,

        /// <summary>
        /// 通过验证根密钥重建卡片文件结构
        /// </summary>
        DesFireEV1操作命令_格式化卡片 = 0xB0,
        /// <summary>
        /// 验证对应的密钥读取应用文件数据
        /// </summary>
        DesFireEV1操作命令_写数据_高级命令 = 0xB1,

        DesFireEV1操作命令_读数据_高级命令 = 0xB2,
        DesFireEV1操作命令_更改密钥 = 0xB3,
        DesFireEV1操作命令_增加应用 = 0xB4,
        DesFireEV1操作命令_写应用目录下的文件数据 = 0xB5,
        DesFireEV1操作命令_读应用目录下的文件数据 = 0xB6,
        DesFireEV1操作命令_修改指定应用目录下指定密钥ID的密钥值 = 0xB7,
        DesFireEV1操作命令_获取卡片应用目录信息 = 0xB8,
        /// <summary>
        /// 单步指令-选择应用目录
        /// </summary>
        DesFireEV1操作命令_选择应用目录 = 0xB9,
        /// <summary>
        /// 单步指令-密钥验证
        /// </summary>
        DesFireEV1操作命令_验证密钥 = 0xBA,

        /// <summary>
        /// 单步指令-读指定的文件数据
        /// </summary>
        DesFireEV1操作命令_读数据_基本命令 = 0xBB,
        /// <summary>
        /// 单步指令-写指定的文件数据
        /// </summary>
        DesFireEV1操作命令_写数据_基本命令 = 0xBC,
    }

    public abstract class MessageBase : MessageTemplateBase
    {
        /// <summary>
        /// 整个数据帧的长度,包含 LEN 本身及帧最后的校验值
        /// </summary>
        [Format(1, EncodingType.BIN, -9999)]
        [Range(4, 0x32, "数据长度 must be range from {1} to {2}, but actual is {0}")]
        public byte Length { get; set; }

        /// <summary>
        /// 读卡模块的地址,485 通信会校验此地址,地址错误模块不响应命令
        /// </summary>
        [Format(1, EncodingType.BIN, -9950)]
        [Range(0, 255, "模块地址 must be range from {1} to {2}, but actual is {0}")]
        public byte ModulePhysicalAddress { get; set; } = 1;

        [Format(1, EncodingType.BIN, -9930)]
        public CommandType 命令代码 { get; set; }

        /// <summary>
        /// 数据区+校验值(除了 CHECK 以外的所有数据累加和取反后取最低字节)
        /// </summary>
        [EnumerableFormat("%cascade", 0)]
        public List<byte> RawDataAndCheck { get; set; }


        //public override string ToLogString()
        //{
        //    if (this.ControlCharacter == ControlCharacter.EOT)
        //        return "EOT(Adrs: 0x" + this.Adrs.ToString("X").PadLeft(2, '0') + ", SeqNo: 0x" + this.BlockSeqNumber.ToString("X").PadLeft(2, '0') + ")";
        //    else if (this.ControlCharacter == ControlCharacter.ACK)
        //        return "ACK(Adrs: 0x" + this.Adrs.ToString("X").PadLeft(2, '0') + ", SeqNo: 0x" + this.BlockSeqNumber.ToString("X").PadLeft(2, '0') + ")";
        //    else
        //        return base.ToLogString();
        //}
    }
}