using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using Newtonsoft.Json.Linq;

namespace Project
{
    public partial class FMain
    {
        bool RecvQRProcess(List<string> qrdatas, eWorkPort vIdx)
        {
            //데이터가없으면 처리하지 않는다.
            if (qrdatas == null || qrdatas.Count < 1) return false;

            bool FindData = false;
            var idata = vIdx == eWorkPort.Left ? PUB.Result.ItemDataL : PUB.Result.ItemDataR;

            //표준바코드라면 그 값을 표시해준다
            lock (PUB.Result.BCDPatternLock)
            {
                var patterns = PUB.Result.BCDPattern;

                foreach (var datas in qrdatas)
                {
                    // JSON 구조에서 "data" 필드 추출
                    string barcodeData = datas;
                    try
                    {
                        var jobj = JObject.Parse(datas);
                        if (jobj["data"] != null)
                        {
                            barcodeData = jobj["data"].ToString();
                        }
                    }
                    catch
                    {
                        // JSON 파싱 실패 시 원본 데이터 사용
                        barcodeData = datas;
                    }

                    //원본자료를 체크한다
                    if (barcodeData.Equals(idata.VisionData.PrintQRData))
                    {
                        //인쇄한 자료와 동일한 자료이다
                        FindData = true;
                    }

                    //표준 바코드 형태만 취한다
                    var pats = patterns.Where(t => t.IsAmkStd && t.IsEnable).OrderBy(t => t.Seq).ToList();
                    if (pats.Any())
                    {
                        //패턴을 확인하여 값을 표시해준다
                        //var ValueApplyCount = 0;
                        foreach (var pt in pats)
                        {
                            var regx = new Regex(pt.Pattern, RegexOptions.IgnoreCase, new TimeSpan(0, 0, 10));
                            if (regx.IsMatch(barcodeData))    //패턴이 일치하다면 이것만 사용한다
                            {
                                //find data
                                var matchs = regx.Matches(barcodeData);
                                foreach (System.Text.RegularExpressions.Match mat in matchs)
                                {
                                    foreach (var matchdata in pt.Groups)
                                    {
                                        if (matchdata.GroupNo <= mat.Groups.Count)
                                        {
                                            var data = mat.Groups[matchdata.GroupNo];
                                            switch (matchdata.TargetPos.ToUpper())
                                            {
                                                case "SID":
                                                    idata.VisionData.SID2 = data.Value;
                                                    break;
                                                case "RID":
                                                    idata.VisionData.RID2 = data.Value;
                                                    break;
                                                case "VLOT":
                                                    idata.VisionData.VLOT2 = data.Value;
                                                    break;
                                                case "VNAME":
                                                    idata.VisionData.VNAME2 = data.Value;
                                                    break;
                                                case "MFG":
                                                    idata.VisionData.MFGDATE2 = data.Value;
                                                    break;
                                                case "QTY":
                                                    idata.VisionData.QTY2 = data.Value;
                                                    break;
                                                case "PART":
                                                    idata.VisionData.PARTNO2 = data.Value;
                                                    break;
                                            }
                                        }
                                    }
                                }
                                break;
                            }
                        }
                    }
                }

            }


            //자료는 있었지만 바코드검증이 실패된 경우이다
            //타임아웃까지 기다리지 않고 바로 오류처리를 한다.
            if (FindData == true)
            {
                //데이터를 찾았다면 완료처리를 해준다
                idata.VisionData.Complete = true;
                //PUB.Result.ItemData[vIdx].VisionData.Complete = true;
                return true;

            }

            return false;

            //else
            //{
            //	var item = Pub.Result.ItemData[vIdx];
            //	var tsGrab = DateTime.Now - Pub.GetVarTime(VAR_LIVEVIEW);
            //	var timeoutVision = vIdx == 1 ? COMM.SETTING.Data.Timeout_VisionProcessL : COMM.SETTING.Data.Timeout_VisionProcessU;
            //	if (tsGrab.TotalMilliseconds >= timeoutVision)
            //	{
            //		//다음 바코드가 있다면 추가 진행을 위해서 남겨준다
            //		_SM_SAVEIMAGE(vIdx, DateTime.Now, "Images(QRValid)");


            //		WS_Send((idx == 0 ? 0 : 1), Pub.wsL, Pub.Result.ItemData[idx].guid, "OFF");


            //		var barcodepos = vIdx == 0 ? "LEFT" : "RIGHT";
            //		Pub.log.AddE("(" + barcodepos + ")바코드를 검증했지만 일치하지 않습니다");
            //		Pub.Result.SetResultMessage(eResult.OPERATION, eECode.BARCODEVALIDERR, eNextStep.pause,
            //			vIdx, Pub.Result.ItemData[vIdx].VisionData.RID, Pub.Result.ItemData[vIdx].VisionData.RID2,
            //			Pub.Result.ItemData[vIdx].VisionData.QTY, Pub.Result.ItemData[vIdx].VisionData.QTY2,
            //			Pub.Result.ItemData[vIdx].VisionData.SID, Pub.Result.ItemData[vIdx].VisionData.SID2,
            //			Pub.Result.ItemData[vIdx].VisionData.MFGDATE, Pub.Result.ItemData[vIdx].VisionData.MFGDATE2,
            //			barcodepos);
            //		return;
            //	}
            //}
        }

    }
}
