using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Logging;
using SlnMesnac.Config;
using SlnMesnac.Model.domain;
using SlnMesnac.Repository.service;
using SlnMesnac.Repository.service.LogImpl;
using SlnMesnac.Repository.service.ScanLog;
using TouchSocket.Core;
using TouchSocket.Http;
using TouchSocket.Rpc;
using TouchSocket.WebApi;

namespace SlnMesnac.TouchSocket
{
    public  class ApiServer : RpcServer
    {
        private readonly IScanLogService _scanService;

        private readonly IBaseCodeService _baseCodeService;

        private readonly IBaseLogService _baseLogService;
        
        public Action<ScanLogModel>? ScanLogSocketAction;
        public Action<ScanStatusSocket>? ScanStatusSocketAction;

        private ILogger<ApiServer> _logger;

        private AppConfig _appConfig;


        public ApiServer(IScanLogService scanService, IBaseCodeService baseCodeService, IBaseLogService baseLogService, ILogger<ApiServer> logger,AppConfig appConfig)
        {
            _scanService = scanService;
            _baseCodeService = baseCodeService;
            _baseLogService = baseLogService;
            _logger=logger;
            _appConfig=appConfig;
        }




        [EnableCors("cors")]
        [WebApi(HttpMethodType.POST)]

        public string Test(IWebApiCallContext callContext)
        {
            //http内容
            var httpContext = callContext.HttpContext;

            //http请求
            var request = httpContext.Request;

            var str = request.GetBody();

          
            _logger.LogInformation("测试body{Data}", str);
            return str;
        }

        [EnableCors("cors")]
        [WebApi(HttpMethodType.POST)]

        public Back Back(Hk hk)
        {
            Back ba=new Back();
            _logger.LogInformation("==========================");
            _logger.LogInformation("{Data}", hk.ToJsonString());
            _logger.LogInformation("==========================");
            if (hk.data_type == 1)
            {
                BaseLog log = new BaseLog();
                log.LogLevel = "Info";
                log.ErrMsg = "";
                log.Content = hk.ToJsonString();
                try
                {
                    //标签处理逻辑算法
                    FilterBuffer(ref hk, out string result);

                    //复制共享图像到指定路径
                    CopyImageWithDateFolder(hk.url, result,out string destinationImagePath);

                    string isOk = string.Empty;

                    if(result != "多条码" && result != "noread" && result != "NoRead" && !string.IsNullOrEmpty(result))
                    {
                        isOk = "Ok";
                    }else if(result == "多条码")
                    {
                        isOk = "Mul";
                    }else
                    {
                        isOk = "Ng";
                    }

                    ScanLogSocket scan = new ScanLogSocket()
                    {
                        code = hk.code,
                        data_type = hk.data_type,
                        ocr = hk.ocr,
                        rfid = hk.rfid,
                        timestamp = hk.timestamp,
                        url = destinationImagePath,
                        isOk = isOk,
                        result = result
                    };
                    ba = ScanBack(scan);

                }
                catch (Exception e)
                {
                    _logger.LogError(e, e.Message);
                    log.LogLevel = "Error";
                    log.ErrMsg = e.Message;
                }
                _baseLogService.Insert(log);

            }
            else
            {
                if (hk.data_type == 2)
                {
                    ScanStatusSocket scan = new ScanStatusSocket()
                    {
                       
                        data_type = hk.data_type,
                        is_alarm = hk.is_alarm,
                        device_status = hk.device_status,
                        timestamp = hk.timestamp,
                       
                    };
                    ba = ScanStatus(scan);

                }
            }

            return ba;
        }


        /// <summary>
        /// 扫描的状态回传
        /// </summary>
        /// <param name="scanStatus"></param>
        /// <returns></returns>
        [EnableCors("cors")]
        [WebApi(HttpMethodType.POST)]
        public Back ScanStatus(ScanStatusSocket scanStatus)
        {
            //_logger.LogInformation("扫描的状态接口");
            //_logger.LogInformation("{Data}",scanStatus.ToJsonString());
            BaseLog log = new BaseLog
            {
                LogLevel = "Info",
                ErrMsg = "",
                Content = scanStatus.ToJsonString()
            };
            try
            {
                if (scanStatus.is_alarm == 1 && scanStatus.device_status != null && scanStatus.device_status.Count > 0)
                {
                    List<string> ls = new List<string>();
                    var baseCodes = _baseCodeService.QuListCache();
                    foreach (var baseCode in scanStatus.device_status)
                    {
                        var enBaseCode = baseCodes.FirstOrDefault(x => x.Code == baseCode);
                        if (enBaseCode != null)
                        {
                            ls.Add(enBaseCode.State);
                        }
                    }
                    scanStatus.status_txt = ls;
                }

                ScanStatusSocketAction?.Invoke(scanStatus);
               
            }
            catch (Exception e)
            {
                _logger.LogError(e,e.Message);
                log.LogLevel = "Error";
                log.ErrMsg=e.Message;
            }

            Task.Run(() =>
            {
                lock (string.Empty)
                {
                    _baseLogService.Insert(log);
                }
            });

             return new Back();

        }


        /// <summary>
        /// 扫描数据回传接口
        /// </summary>
        /// <param name="scanLog"></param>
        /// <returns></returns>
        [EnableCors("cors")]
        [WebApi(HttpMethodType.POST)]
        public Back ScanBack(ScanLogSocket scanLog)
        {

            //_logger.LogInformation("扫描数据回传接口");
            //_logger.LogInformation("{Data}", scanLog.ToJsonString());

            var model = new ScanLogModel()
            {
                CreateTime = scanLog.CreateTime,
                DataType = scanLog.data_type,
                Code = scanLog.code,
                Rfid = scanLog.rfid,
                Ocr = scanLog.ocr,
                Url = scanLog.url,
                IsOk = scanLog.isOk,
                Result = scanLog.result
            };

            ScanLogSocketAction?.Invoke(model);
            _scanService.Insert(model);

            return new Back();

        }

        private const string bufferStart = "0C1104";
        private const string bufferBody = "EE5EFB65";

        /// <summary>
        /// RFID信息解析
        /// </summary>
        /// <param name="rfidStr"></param>
        private void AnasysBuffer(ref string rfidStr)
        {
            if(rfidStr != "noread")
            {
                string bufferHex = rfidStr.Substring(bufferStart.Length, bufferBody.Length);
                long decimalValue = Convert.ToInt64(bufferHex, 16);

                rfidStr = decimalValue.ToString();
            }

        }

        /// <summary>
        /// 标签处理逻辑算法
        /// </summary>
        /// <param name="hk"></param>
        /// <param name="result"></param>
        /// <exception cref="InvalidOperationException"></exception>
        private void FilterBuffer(ref Hk hk,out string result)
        {
            try
            {
                result = string.Empty;

                if (hk.rfid == "noread" || string.IsNullOrEmpty(hk.rfid))
                {
                    if (!string.IsNullOrEmpty(hk.code) && hk.code != "NoRead")
                    {
                        result = hk.code;

                    }
                    else
                    {
                        result = hk.rfid;
                    }
                }
                else
                {

                    string[] buffer = hk.rfid.Split(",");

                    if (buffer.Length > 1)
                    {
                        hk.rfid = "多条码";
                        
                    }
                    else
                    {
                        string rfidStr = hk.rfid;
                        if (!string.IsNullOrEmpty(hk.rfid))
                        {
                            AnasysBuffer(ref rfidStr);

                            hk.rfid = rfidStr;

                            
                        }
                    }

                    if (hk.rfid != hk.code && !string.IsNullOrEmpty(hk.code) && hk.code != "NoRead")
                    {
                        result = hk.code;
                    }
                    else
                    {
                        result = hk.rfid;
                    }
                }

                //处理ATR数据
                if (string.IsNullOrEmpty(hk.code) || hk.code == "NoRead")
                {
                    if (hk.rfid != "多条码" && hk.rfid != "noread")
                    {
                        result = hk.rfid;
                    }else
                    {
                        

                        if(hk.rfid == "多条码")
                        {
                            result = hk.rfid;
                        }
                        else
                        {
                            result = hk.code;
                        }
                    }
                }
                else
                {
                    string[] buffer = hk.code.Split(",");

                    if (buffer.Length > 1)
                    {
                        hk.code = "多条码";
                        
                    }

                    if (hk.rfid == hk.code && !string.IsNullOrEmpty(hk.rfid) && hk.rfid != "NoRead" && hk.rfid != "多条码")
                    {
                        result = hk.rfid;
                    }
                    else
                    {
                        result = hk.code;
                    }
                }

            }
            catch(Exception ex)
            {
               throw new InvalidOperationException($"标签处理逻辑异常:{ex.Message}");
            }
        }

        /// <summary>
        /// 将全景图像复制到指定路径下
        /// </summary>
        /// <param name="sourceImagePath"></param>
        /// <param name="fileName"></param>
        private void CopyImageWithDateFolder(string sourceImagePath,string fileName,out string destinationImagePath)
        {
            try
            {
                if (string.IsNullOrEmpty(sourceImagePath))
                {
                    throw new ArgumentNullException("全景图像路径为空");
                }

                if (string.IsNullOrEmpty(fileName))
                {
                    throw new ArgumentNullException("自定义全景图像文件名称为空");
                }

                string destinationBasePath = _appConfig.imagePath;

                DateTime now = DateTime.Now;
                string dateFolder = now.Year + "-" + now.Month + "-" + now.Day;

                string destinationFolder = Path.Combine(destinationBasePath, dateFolder);
                if (!Directory.Exists(destinationFolder))
                {
                    Directory.CreateDirectory(destinationFolder);

                    // 创建 ok、ng、mul 文件夹
                    string okFolder = Path.Combine(destinationFolder, "ok");
                    string ngFolder = Path.Combine(destinationFolder, "ng");
                    string mulFolder = Path.Combine(destinationFolder, "mul");
                    Directory.CreateDirectory(okFolder);
                    Directory.CreateDirectory(ngFolder);
                    Directory.CreateDirectory(mulFolder);
                }

                string sourceFileName = Path.GetFileName(sourceImagePath);
                string extension = Path.GetExtension(sourceImagePath);

                string newFileName = now.ToString("HHmmssfff") + "-" + fileName + extension;

                string subFolder = DetermineSubFolder(fileName);
                destinationImagePath = Path.Combine(destinationFolder, subFolder, newFileName);

                File.Copy(sourceImagePath, destinationImagePath, true);

                //File.Delete(sourceImagePath);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException($"将全景图像复制到指定路径处理异常:{ex.Message}");
            }
        }

        private string DetermineSubFolder(string fileName)
        {
            if (fileName.Contains("ead"))
            {
                return "ng";
            }
            else if (fileName.Contains("多条码"))
            {
                return "mul";
            }
            else
            {
                return "ok";
            }
        }
    }
}



public class Hk
{
    public DateTime CreateTime
    {
        get
        {
            DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(timestamp);
            return dateTimeOffset.UtcDateTime;
        }
    }

    public long timestamp { get; set; }

    public int data_type { get; set; }

    public string rfid { get; set; }

    public string code { get; set; }

    public string ocr { get; set; }

    public string url { get; set; }



    public int is_alarm { get; set; }

    public List<string> device_status { get; set; }


    public List<string> status_txt { get; set; }
}