using Keyence.AutoID.SDK;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace Project
{
    public partial class fMain
    {
        Regex regex = null;

        /// <summary>
        /// 적용가능한 룰이 없으면 처리하지 않는다.
        /// </summary>
        /// <returns></returns>
        private Boolean Process_CustomerRule(string vdata)
        {
            bool retval = false;
            if (string.IsNullOrWhiteSpace(vdata)) return retval;
            var dt = Pub.Result.CustomerRule;
            if (dt.Count < 1) return retval;

            //이 데이터가 정규식에 match 가되는지 확인하.ㄴㄷ
            var ucnt = 0;
            foreach (DataSet1.Component_Reel_CustRuleRow dr in dt.Rows)
            {

                if (dr.MatchEx.isEmpty()) continue; //매칭키는 반드시 있어야 한다.
                if (dr.varName.isEmpty()) continue; //찾더라도 대상이 없으니 안한다
                var vData = Pub.Result.ItemData[1].VisionData;
                if (vData.Confirm) break; //완료처리된건 하지않는다

                regex = new Regex(dr.MatchEx);    //한글 3글자
                if (regex.IsMatch(vdata))
                {
                    var matchlist = regex.Matches(vdata);
                    var match0 = matchlist[dr.MatchIndex];
                    var grpval = match0.Groups[dr.GroupIndex].Value;
                    var result = grpval.Trim();
                    if (dr.ReplaceEx.isEmpty() == false && dr.ReplaceStr.isEmpty() == false)
                    {
                        regex = new Regex(dr.ReplaceEx);
                        if (regex.IsMatch(result)) result = regex.Replace(result, dr.ReplaceStr);
                    }
                    ucnt += 1;
                    switch (dr.varName)
                    {
                        case "QTY0":
                            vData.QTY0 = result;
                            vData.QTYRQ = vdata.StartsWith("RQ");
                            break;
                        case "SID":
                            vData.SID = result;
                            break;
                        case "LOT":
                            vData.VLOT = result;
                            break;
                        case "PART":
                            vData.PARTNO = result;
                            break;
                        case "MFGDATE":
                            vData.MFGDATE = result;
                            break;
                        case "QTY":
                            vData.QTY = result;
                            break;
                        default:
                            ucnt -= 1;
                            Pub.log.AddAT($"RegEx 대상 VarName을 찾을 수 없습니다. 값:{dr.varName}");
                            break;
                    }
                }
            }
            retval = ucnt > 0; //적용데이터가 1건이라도 있으면 확인
            return retval; //적용ㄱ
        }
        private Boolean Process_BasicRule(string vData)
        {

            //amkor 포맷도 아닌 데이터가 오는 경우에는 추측해서 데이터를 입력해준다.
            int qty;
            string datestr = string.Empty;
            bool retval = true;

            //수동입력의 경우에만 RQ값을 사용한다.
            if (Pub.Result.Option_QtyUpdateM) Process_ReturnReel(vData);

            if (vData.StartsWith("PSK")) //murate 의 reel id 형식
            {
                Pub.Result.ItemData[1].VisionData.SetRID(vData, "PARSEBARCODE_PSK");//.Substring(3);
                Pub.Result.ItemData[1].VisionData.HASHEADER = true;
            }
            if (vData.StartsWith("1V") && vData.Length == 8) //무라타의 서플라이어코드
            {
                //Pub.Result.ItemData[1].VisionData.SCODE = vData.Substring(2);
            }
            if (vData.StartsWith("1T")) //무라타의 LOT
            {
                //Pub.Result.ItemData[1].VisionData.VLOT = vData.Substring(2);
                //Pub.Result.ItemData[1].VisionData.HASHEADER = true;
            }
            if (vData.StartsWith("1P")) //무라타의 파트넘버
            {
                //Pub.Result.ItemData[1].VisionData.PARTNO = vData.Substring(2);
                //Pub.Result.ItemData[1].VisionData.HASHEADER = true;
            }

            if (vData.StartsWith("Q"))
            {
                if (Pub.Result.ItemData[1].VisionData.QTYRQ == false)
                {
                    int qty0;
                    if (int.TryParse(vData.Substring(1), out qty0))
                    {
                        Pub.Result.ItemData[1].VisionData.QTY = vData.Substring(1);
                        Pub.Result.ItemData[1].VisionData.HASHEADER = true;
                    }
                }
                else
                {
                    Pub.log.Add("RQ값이 적용되어 프리픽스 Q값=" + vData + "을 적용하지 않습니다");
                }
            }
            if (vData.StartsWith("17D") && vData.Length == 11) //생산일
            {
                Pub.Result.ItemData[1].VisionData.MFGDATE = vData.Substring(3);// + "-"+ vData.Substring(3,2) + "-" + vData.Substring(5,2);
                Pub.Result.ItemData[1].VisionData.HASHEADER = true;
            }
            if (vData.Split(',').Length == 6 && vData.StartsWith("P")) //특수포맷 추가 코드
            {
                var CommaBuf = vData.Split(',');
                foreach (var item in CommaBuf)
                {
                    if (item.StartsWith("P"))
                        Pub.Result.ItemData[1].VisionData.PARTNO = item.Substring(1);
                    else if (item.StartsWith("Q"))
                    {
                        if (Pub.Result.ItemData[1].VisionData.QTYRQ == false)
                        {
                            Pub.Result.ItemData[1].VisionData.QTY = item.Substring(1);
                        }
                        else
                        {
                            Pub.log.Add("RQ값이 적용되어있어 특수 문자 수량값=" + vData + "을 적용하지 않음");
                        }
                    }

                    else if (item.StartsWith("L"))
                        Pub.Result.ItemData[1].VisionData.VLOT = item.Substring(1);
                    else if (item.StartsWith("D") && item.IndexOf('/') != -1)
                    {
                        var datestrbuf = item.Substring(1).Split('/');
                        if (datestrbuf.Length == 3)
                        {
                            Pub.Result.ItemData[1].VisionData.MFGDATE =
                                datestrbuf[0].PadLeft(4, '0') +
                                datestrbuf[1].PadLeft(2, '0') +
                                datestrbuf[2].PadLeft(2, '0');
                        }

                    }

                }
            }
            else if (IsDateValue(vData, out datestr))
            {
                Pub.Result.ItemData[1].VisionData.MFGDATE = datestr;
            }
            else if (IsSIDValue(vData))
            {
                if (vData.StartsWith("101"))
                {
                    if (Pub.Result.ItemData[1].VisionData.SID0.isEmpty() == true)
                    {
                        Pub.log.Add("SID값 변경함 #3 " + Pub.Result.ItemData[1].VisionData.SID + "=>" + vData);
                        Pub.Result.ItemData[1].VisionData.SID = vData;
                    }
                }
                else if (vData.StartsWith("103"))
                {
                    //103을 ㅗ시작하면 기존데이터가 101인경우에는 처리하지 않는다
                    if (Pub.Result.ItemData[1].VisionData.SID.StartsWith("101") == false)
                    {
                        Pub.log.Add("SID값 변경함 #4 " + Pub.Result.ItemData[1].VisionData.SID + "=>" + vData);
                        Pub.Result.ItemData[1].VisionData.SID = vData;
                    }

                }
                else
                {
                    if (Pub.Result.ItemData[1].VisionData.SID0.isEmpty() == true)
                    {
                        Pub.log.Add("SID값 변경함 #5 " + Pub.Result.ItemData[1].VisionData.SID + "=>" + vData);
                        Pub.Result.ItemData[1].VisionData.SID = vData;
                    }
                }
            }
            else if (int.TryParse(vData, out qty) && qty < 200000 && qty >= 3000)
            {
                //수량으로 변환이 된다.
                if (Pub.Result.ItemData[1].VisionData.QTYRQ == false)
                {
                    Pub.Result.ItemData[1].VisionData.QTY = qty.ToString();
                }
                else
                {
                    Pub.log.Add("RQ값이 적용되어있어, 수량으로 추측한 문자=" + vData + "를 적용하지 않습니다");
                }
            }
            else retval = false;
            return retval;
        }
    }
}
