using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace PTMedicalInsurance.Business.MetalKeyboard.JustTideEPP
{
    /// <summary>
    /// JustTide 金属密码键盘驱动接口封装类
    /// </summary>
    public class JustTideEPPDrv
    {
        // 指定 DLL 名称（确保 DLL 在程序运行目录或系统路径中）
        private const string DllName = "JustTideEPPDrv.dll";

        // ===================================================================
        // 5.1.1 OpenCom - 打开串口
        // ===================================================================
        /// <summary>
        /// 打开通讯端口，使键盘可以进行通讯。
        /// </summary>
        /// <param name="iPort">串口号：1=COM1, 2=COM2, ..., 9=COM9</param>
        /// <param name="lBaud">波特率：4800, 9600, 19200, 57600, 115200</param>
        /// <returns>成功返回 0，否则返回 -2</returns>
        [DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
        public static extern short OpenCom(short iPort, int lBaud); // long 在 C# 中对应 int (32位)

        // ===================================================================
        // 5.1.2 CloseCom - 关闭串口
        // ===================================================================
        /// <summary>
        /// 关闭通讯端口，停止对键盘的通讯。
        /// </summary>
        /// <returns>成功返回 0，否则返回错误码</returns>
        [DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
        public static extern short CloseCom();

        // ===================================================================
        // 5.1.3 PinInitialization - 密码键盘初始化
        // ===================================================================
        /// <summary>
        /// 初始化密码键盘。
        /// </summary>
        /// <param name="iInitMode">
        /// 初始化模式：
        /// 0: 初始化键盘，不清除密钥
        /// 1: 初始化键盘，清除所有密钥，恢复出厂设置
        /// </param>
        /// <returns>成功返回 0，否则返回错误码</returns>
        [DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
        public static extern short PinInitialization(short iInitMode);

        // ===================================================================
        // 5.1.4 PinReadVersion - 读取版本信息
        // ===================================================================
        /// <summary>
        /// 读取密码键盘的版本信息、序列号和描述代码。
        /// </summary>
        /// <param name="cpVersion">输出：版本信息 (16 字节 ASCII)</param>
        /// <param name="cpSN">输出：生产序列号 (8 字节 BCD + 4 字节填充或芯片编号)</param>
        /// <param name="cpRechang">输出：描述代码 (2 字节，如充电时间)</param>
        /// <returns>成功返回 0，否则返回错误码</returns>
        [DllImport(DllName, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        public static extern short PinReadVersion(
            [Out] StringBuilder cpVersion,
            [Out] StringBuilder cpSN,
            [Out] StringBuilder cpRechang);

        // ===================================================================
        // 可选：定义返回值常量（根据文档补充）
        // ===================================================================
        public const short SUCCESS = 0;
        public const short ERROR_OPEN_COM = -2;
        // 注意：实际错误码需参考“函数返回表”（文档中未提供完整表）

        /// <summary>
        /// 发送多功能控制命令（开关键盘、声音、设置模式等）
        /// </summary>
        /// <param name="iValue">控制命令值（详见文档 CTL 表）</param>
        /// <returns>成功返回 0，否则返回错误码</returns>
        [DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
        public static extern short OpenKeyVoic(short iValue);



        // ===================================================================
        // 便捷方法
        // ===================================================================

        /// <summary>
        /// 开启键盘（带声音）
        /// </summary>
        public static short EnableKeyboard() => OpenKeyVoic((short)KeyControlCommand.TurnOnKeyboardAndSound);

        /// <summary>
        /// 关闭键盘（静音）
        /// </summary>
        public static short DisableKeyboard() => OpenKeyVoic((short)KeyControlCommand.TurnOffKeyboardAndSound);

        /// <summary>
        /// 打开夜视灯（如支持）
        /// </summary>
        public static short TurnOnNightLight() => OpenKeyVoic((short)KeyControlCommand.TurnOnNightVisionLight);

        /// <summary>
        /// 关闭夜视灯（如支持）
        /// </summary>
        public static short TurnOffNightLight() => OpenKeyVoic((short)KeyControlCommand.TurnOffNightVisionLight);

        /// <summary>
        /// 设置通信编码模式：0-9加30H, A-F加37H
        /// </summary>
        public static short SetHexEncoding() => OpenKeyVoic((short)KeyControlCommand.CommEncodingHex37H);

        /// <summary>
        /// 从密码键盘接收一个按键字符（阻塞式，带超时）
        /// </summary>
        /// <param name="cpKey">输出：接收到的字符（ASCII）</param>
        /// <param name="iTimeOut">超时时间（毫秒）</param>
        /// <returns>成功返回 0；超时或错误返回非 0 值</returns>
        [DllImport(DllName, CallingConvention = CallingConvention.StdCall)]
        public static extern short PinReportPressed(ref char cpKey, short iTimeOut);

        

    }

    // ===================================================================
    // 枚举：常用控制命令（便于使用）
    // ===================================================================
    public enum KeyControlCommand : short
    {
        /// <summary>
        /// 关闭键盘 + 关闭蜂鸣声（非固化）
        /// </summary>
        TurnOffKeyboardAndSound = 0x00,

        /// <summary>
        /// 打开键盘 + 关闭蜂鸣声（非固化）
        /// </summary>
        TurnOnKeyboardMuteSound = 0x01,

        /// <summary>
        /// 关闭键盘 + 打开蜂鸣声（非固化）
        /// </summary>
        TurnOffKeyboardOnlySound = 0x02,

        /// <summary>
        /// 打开键盘 + 打开蜂鸣声（非固化，正常模式）
        /// </summary>
        TurnOnKeyboardAndSound = 0x03,

        /// <summary>
        /// IC卡使用 02 头命令（固化，默认）
        /// </summary>
        ICCardUse02Header = 0x04,

        /// <summary>
        /// IC卡使用 ESC(1B) 头命令（固化）
        /// </summary>
        ICCardUseEscHeader = 0x05,

        /// <summary>
        /// 打开夜视灯（非固化，需硬件支持）
        /// </summary>
        TurnOnNightVisionLight = 0x06,

        /// <summary>
        /// 关闭夜视灯（非固化，需硬件支持）
        /// </summary>
        TurnOffNightVisionLight = 0x07,

        /// <summary>
        /// 命令尾不加 03h（固化）
        /// </summary>
        CommandTailNo03 = 0x08,

        /// <summary>
        /// 命令尾加 03h（固化）
        /// </summary>
        CommandTailWith03 = 0x09,

        /// <summary>
        /// 更正键：删除所有已输入字符（固化，默认）
        /// </summary>
        CorrectKeyDeleteAll = 0x14, // 20

        /// <summary>
        /// 更正键：删除一个字符（固化）
        /// </summary>
        CorrectKeyDeleteOne = 0x15, // 21

        /// <summary>
        /// 通信：拆分后全加 30H（固化）
        /// </summary>
        CommEncodingAdd30H = 0x1E, // 30

        /// <summary>
        /// 通信：0-9加30H, A-F加37H（固化）
        /// </summary>
        CommEncodingHex37H = 0x25, // 37

        // 波特率设置（0x41 ~ 0x48）
        SetBaudRate1200 = 0x41,
        SetBaudRate2400 = 0x42,
        SetBaudRate4800 = 0x43,
        SetBaudRate9600 = 0x44,
        SetBaudRate19200 = 0x45,
        SetBaudRate38400 = 0x46,
        SetBaudRate57600 = 0x47,
        SetBaudRate115200 = 0x48,
    }

}
