using System;
using System.Linq;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Text;

namespace ITC81DB
{
    #region Enum
    public enum BarcodeStatus
    {
        None,
        Normal,
        NoRead,
        NoMatch,
    } 
    #endregion

    public class BarcodeShortCut
    {
        public static readonly string MinAngle = "5362";
        public static readonly string MaxAngle = "5363";
        public static readonly string Frequency = "5364";
        public static readonly string ReadingPhaseTimeout = "78";
        public static readonly string Timeout = "79";
        public static readonly string ReadingConditions = "5250";
    }

    public class Barcode
    {
        #region Field
        public static byte[] EnterHostMode = { 0x1B, 0x5B, 0x43 };
        public static byte[] EnterTerminalMode = { 0x1B, 0x5D, 0x42 };
        public static byte[] EnterProgrammingMode = { 0x1B, 0x63, 0x4D, 0xB0, 0x30 };
        public static byte[] ExitProgrammingMode = { 0x1B, 0x64, 0x4D, 0xB0, 0x30 };
        public static byte[] ExitTerminalMode = { 0x1B, 0x49, 0x41, 0x20 };
        public static byte[] ExitHostMode = { 0x1B, 0x5B, 0x41 };
        public static byte[] AutoExitCommandMode = { 0x1B, 0x5B, 0x41 };
        public static byte[] SavePermanently = { 0x45, 0x20, 0x50, 0x0D, 0x0A };

        private bool m_IsCommandMode; // 현재 커맨드 모드인지 확인
        private int m_SaveValue; // 설정한 값 저장 변수
        private string m_SaveGettingShortCut; // 설정한 Getting ShortCut 변수
        private string m_SaveSettingShortCut; // 설정한 Setting ShortCut 변수

        private Queue<string> QueueBarcode;
        private Collection<string> CollectionLotNo;
        #endregion

        #region Constructor
        public Barcode(Collection<ProductItem> items, int productCount)
        {
            this.DefaultSetting(productCount);

            for (int i = 0; i < productCount; i++)
                this.CollectionLotNo[i] = items[i].LotNo;
        }
        #endregion

        #region Property
        public bool IsCommandMode
        {
            get { return this.m_IsCommandMode; }
            set { this.m_IsCommandMode = value; }
        }
        public int SaveValue
        {
            get { return this.m_SaveValue; }
            set { this.m_SaveValue = value; }
        }
        public string SaveGettingShortCut
        {
            get { return this.m_SaveGettingShortCut; }
            set { this.m_SaveGettingShortCut = value; }
        }
        public string SaveSettingShortCut
        {
            get { return this.m_SaveSettingShortCut; }
            set { this.m_SaveSettingShortCut = value; }
        }

        public int GetQueueCount
        {
            get
            {
                return this.QueueBarcode.Count;
            }
        }
        #endregion

        #region Method
        private void DefaultSetting(int barcodeCount)
        {
            this.IsCommandMode = false;
            this.QueueBarcode = new Queue<string>();

            this.CollectionLotNo = new Collection<string>();
            for (int i = 0; i < barcodeCount; i++)
                this.CollectionLotNo.Add("");
        }

        public void SetLotNo(Collection<ProductItem> items, int productCount)
        {
            for (int i = 0; i < productCount; i++)
                this.CollectionLotNo[i] = items[i].LotNo;
        }
        public void SetData(string data)
        {
            //value = this.DecisionLength(data);
            this.QueueBarcode.Enqueue(data);
        }
        public BarcodeStatus GetData(ref int productNo)
        {
            string value = "";
            BarcodeStatus ret = BarcodeStatus.None;

            if (this.QueueBarcode.Count > 0)
            {
                value = this.QueueBarcode.Peek();
                if (value.Length > 14)
                    value = value.Substring(value.Length - 14, 14);

                if (value == "NoRead")
                {
                    productNo = 991;
                    return ret = BarcodeStatus.NoRead;
                }
                else
                {
                    for (int i = 0; i < this.CollectionLotNo.Count; i++)
                    {
                        if (this.CollectionLotNo[i] == value)
                        {
                            productNo = i + 1;
                            return ret = BarcodeStatus.Normal;
                        }
                    }

                    productNo = 992;
                    return ret = BarcodeStatus.NoMatch;
                }
            }
         
            productNo = 0;
            return ret = BarcodeStatus.None;
        }
        public BarcodeStatus GetData(ref int productNo, int startIndex, int endIndex)
        {
            string value = "";
            BarcodeStatus ret = BarcodeStatus.None;

            if (this.QueueBarcode.Count > 0)
            {
                value = this.QueueBarcode.Peek();

                if (value == "NoRead")
                {
                    productNo = 991;
                    return ret = BarcodeStatus.NoRead;
                }
                else
                {
                    int length = endIndex - startIndex + 1;
                    if(value.Length >= length)
                        value = value.Substring(startIndex, length);
                    if (value.Length > 14)
                        value = value.Substring(value.Length - 14, 14);

                    for (int i = 0; i < this.CollectionLotNo.Count; i++)
                    {
                        if (this.CollectionLotNo[i] == value)
                        {
                            productNo = i + 1;
                            return ret = BarcodeStatus.Normal;
                        }
                    }

                    productNo = 992;
                    return ret = BarcodeStatus.NoMatch;
                }
            }

            productNo = 0;
            return ret = BarcodeStatus.None;
        }

        /// <summary>
        /// 바코드 길이를 14 이하로 결정
        /// </summary>
        /// <param name="barcode"></param>
        /// <returns>string</returns>
        private string DecisionLength(string barcode)
        {
            if (barcode.Length > 14)
                return barcode.Substring(barcode.Length - 14, 14);
            else
                return barcode;
        }

        public string BarcodePeek()
        {
            string ret = "";

            if (this.QueueBarcode.Count > 0)
                ret = this.QueueBarcode.Peek();

            return ret;
        }
        public void BarcodeDequeue()
        {
            if (this.QueueBarcode.Count > 0)
                this.QueueBarcode.Dequeue();
        }
        public void Clear()
        {
            this.QueueBarcode.Clear();
        }
        #endregion
    }
}
