using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;

namespace Project.Class
{
	public class KeyenceBarcodeData
	{
		public double Angle { get; set; }
		public StdLabelPrint.CAmkorSTDBarcode AmkorData { get; set; }
		public Point[] vertex { get; set; }
		public string Data { get; set; }
		public Point CenterPX { get; set; }
		public bool Ignore { get; set; }

		/// <summary>
		/// 1:QR, 11:Code 128(like 1D)
		/// </summary>
		public string barcodeSymbol { get; set; }
        public string barcodeSource { get; set; }    //230503
		public Boolean UserActive { get; set; }
		public Boolean isSTDBarcode
		{
			get
			{
				if (AmkorData != null && barcodeSymbol == "1" && AmkorData.isValid) return true;
				return false;
			}
		}
		public Boolean isNewLen15
		{
			get
			{
				if (AmkorData != null && barcodeSymbol == "1" && AmkorData.isValid && AmkorData.NewLen15Barcode) return true;
				return false;
			}
		}

		/// <summary>
		/// 라벨의 위치를 표시한다. 8방향이며 키패드 유사하게 설정한다 789/4-6/123
		/// </summary>
		public byte LabelPosition { get; set; }

		/// <summary>
		/// 정규식 분석이 완료되었다면 True를 반환합니다
		/// </summary>
		public Boolean RegExConfirm { get; set; }
		public int RefExApply { get; set; }

		public KeyenceBarcodeData()
		{
			LabelPosition = 0;
			Angle = 0.0;
			Data = string.Empty;
			CenterPX = Point.Empty;
			AmkorData = null;
			vertex = null;
			barcodeSymbol = string.Empty;
			UserActive = false;
			RegExConfirm = false;
			Ignore = false;
            barcodeSource = string.Empty;

        }

		public override string ToString()
		{
			return string.Format("{0},Deg={1},Center={2}x{3}", Data, Angle, CenterPX.X, CenterPX.Y);
		}

		/// <summary>
		/// 해당 중심점이 겹치는지 확인합니다.
		/// </summary>
		/// <param name="Center"></param>
		/// <returns></returns>
		public Boolean CheckIntersect(Point Center, string data)
		{
			if (data == null) return false;
			if (data.Equals(this.Data) == false) return false; //자료가 다르면 다른 자료로 처리한다
			return getInside(Center, vertex);
		}

		bool getInside(Point pt, Point[] ptArr)
		{
			int crosses = 0;
			for (int i = 0; i < ptArr.Length; i++)
			{
				int j = (i + 1) % ptArr.Length;
				if ((ptArr[i].Y > pt.Y) != (ptArr[j].Y > pt.Y))
				{
					//atX는 점 B를 지나는 수평선과 선분 (p[i], p[j])의 교점
					double atX = (ptArr[j].X - ptArr[i].X) * (pt.Y - ptArr[i].Y) / (ptArr[j].Y - ptArr[i].Y) + ptArr[i].X;
					//atX가 오른쪽 반직선과의 교점이 맞으면 교점의 개수를 증가시킨다.
					if (pt.X < atX)
						crosses++;
				}
			}
			return crosses % 2 > 0;
		}

	}
}
