/******************************************************************************
 * 文件名称: CardReader.cs
 * 文件说明: 读卡的封装,包括社保卡,身份证,电子凭证等等
 * 当前版本: V1.0
 * 创建日期: 2022-06-20
 *
 * * 2020-06-20: 增加 CardReader 类
 * *****  2020-06-20: 增加 CardReader 方法,获取URL地址,USER信息,地方版SSCard.dll使用
 * *****  2020-06-20: 增加 CardReader 方法重载,国家版电子凭证使用
 * *****  2020-06-20: 增加 Init 方法,SSCard环境初始化
 * *****  2020-06-20: 增加 ReadCardBas 方法,读社保卡
 * *****  2020-06-20: 增加 VerifyPIN 方法,验证密码
 * *****  2020-06-20: 增加 ChangePIN 方法,修改密码
 * *****  2020-06-20: 增加 ReadSFZ 方法,读身份证
 * *****  2020-06-20: 增加 GetQRBase 方法,读二维码
 * *****  2020-06-20: 增加 NationEcTrans 方法,读电子凭证(国家版)


******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using PTMedicalInsurance.Variables;
using System.Windows.Forms;
using PTMedicalInsurance.Entity.Local;
using PTMedicalInsurance.Helper;
using PTMedicalInsurance.Entity;

namespace PTMedicalInsurance.Common
{
    class CardReader
    {
        const string DllPath = @"HeaSecReadInfo.dll";
        private static bool initilaized = false;

        [DllImport(DllPath, EntryPoint = "Init", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        static extern int Init(StringBuilder pInitInfo, StringBuilder pErrMsg);

        [DllImport(DllPath, EntryPoint = "ReadCardBas", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        static extern int ReadCardBas(StringBuilder pCardInfo,StringBuilder pBusiCardInfo);

        [DllImport(DllPath, EntryPoint = "ReadSFZ", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        static extern int ReadSFZ(StringBuilder pOutBuff, StringBuilder pOutBusiBuff);

        [DllImport(DllPath, EntryPoint = "DailySinIn", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        static extern IntPtr DailySinIn(StringBuilder OutData);

        //电子凭证
        [DllImport(DllPath, EntryPoint = "EcQuery", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int NationEcTrans(StringBuilder InData, StringBuilder OutData);

        public CardReader()
        {
           CardReader.Init();
        }

        public static int Init()
        {
            if (initilaized) return 0;
            string errMsg = "";
            int result = -1;
            try
            {
                ReadCardInitInfo initInfo = new ReadCardInitInfo();
                StringBuilder sbInitInfo = new StringBuilder();

                StringBuilder sbUSER = new StringBuilder(4096);
                sbInitInfo.Append(JsonHelper.toJsonString(initInfo));
                result = Init(sbInitInfo, sbUSER);
                initilaized = true;
                return result;
            }
            catch (Exception ex)
            {
                errMsg = ex.Message;
                return result;

            }
            finally
            {
                Global.writeLog("初始化","", result.ToString() + ":" + errMsg);
            }
        }

        /// <summary>
        /// 读社保卡
        /// </summary>
        /// <param name="basInfo"></param>
        /// <returns></returns>
        public int ReadCardBas(out string basInfo)
        {
            basInfo = ""; 
            int rtn = -1;
            try
            {
                StringBuilder sbCardInfo = new StringBuilder(1024);
                StringBuilder sbBusiCardInfo = new StringBuilder(8192);

                rtn = ReadCardBas(sbCardInfo, sbBusiCardInfo);
                // 解析返回读卡信息
                basInfo = parseCardInfo(sbCardInfo.ToString());
                Global.pat.card.BusinessCode = sbBusiCardInfo.ToString();
                return rtn;
            }
            catch (Exception ex)
            {
                basInfo = "ReadCardBas异常:" + ex.Message;
                return rtn;
            }
            finally
            {
                Global.writeLog("读社保卡", "",basInfo);
            }
        }

        /// <summary>
        /// 读身份证
        /// </summary>
        /// <param name="OutBuff"></param>
        /// <returns></returns>
        public int ReadSFZ(out string OutBuff)
        {
            OutBuff = "";
            int rtn = -1;
            try
            {
                StringBuilder sbOutBuff = new StringBuilder(10240);
                StringBuilder sbBusiCardBuff = new StringBuilder(10240);

                rtn = ReadSFZ(sbOutBuff, sbBusiCardBuff);
                // 解析返回读卡信息
                OutBuff = parseCardInfo(sbOutBuff.ToString());
                Global.pat.card.BusinessCode = sbBusiCardBuff.ToString(); 

                return rtn;
            }
            catch (Exception ex)
            {
                OutBuff = "ReadSFZ 异常:" + ex.Message;
                return rtn;
            }
        }

        /// <summary>
        /// 解析读卡结果
        /// </summary>
        /// <param name="outBuff"></param>
        /// <returns></returns>
        private string parseCardInfo(string inBuff)
        {
            //卡类型、发卡地区行政区划代码(卡识别码前6位)、社会保障号码、卡号、卡识别码、姓名、卡复位信息(仅取历史字节)、规范版本、发卡日期、卡有效期、终端机编号、终端设备号。各数据项之间以“|”分割,且最后一个数据项以“|”结尾
            string[] data = inBuff.Split("|".ToCharArray());
            CardInfo card = new CardInfo();
            card.certno = data[2];
            card.cardno = data[3];
            card.card_sn = data[4];
            card.psn_name = data[5];
            
            Global.pat.insuplc_admdvs = data[1]; //行政区划
            Global.pat.card.SN = card.card_sn;
            Global.pat.certNO = card.certno;
            Global.pat.name = card.psn_name;
            Global.pat.card.NO = card.cardno;

            Global.pat.mdtrtcertNO = card.certno;

            string outParam = JsonHelper.toJsonString(card);
            Global.writeLog("读卡返回:", inBuff, outParam);
            return outParam;
        }

        //public string FastReportPrint(out string OutData)
        //{
        //    OutData = "";
        //    try
        //    {
        //        StringBuilder sbOutData = new StringBuilder(1024);

        //        IntPtr pRtn = FastReportDll(sbOutData);
        //        OutData = sbOutData.ToString();
        //        string rtn = Marshal.PtrToStringAnsi(pRtn);
        //        return rtn;
        //    }
        //    catch (Exception ex)
        //    {
        //        OutData = "FastReportDll调用异常:" + ex.Message;
        //        return "-1";
        //    }
        //    finally
        //    {
        //        Global.writeLog("调用FastReportDll打印结算单)", "", OutData);
        //    }
        //}
    
    }  


}