using System;
using System.Linq;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using INT_LKD.DataStore;
namespace INT_LKD
{
    public class Helper
    {
        /// 
        /// Double형을 String형으로 변환하여 리턴(소수점 자릿수에 맞춰 0을 채워서 리턴)
        /// 
        /// Double형 데이터
        /// 소수점 자릿수
        /// String형 데이터
        public static string DoubleToString(double value, int decimalPlaces)
        {
            if (decimalPlaces == 0)
                return string.Format("{0:F0}", value);
            else if (decimalPlaces == 1)
                return string.Format("{0:F1}", value);
            else if (decimalPlaces == 2)
                return string.Format("{0:F2}", value);
            else if (decimalPlaces == 3)
                return string.Format("{0:F3}", value);
            else if (decimalPlaces == 4)
                return string.Format("{0:F4}", value);
            else if (decimalPlaces == 5)
                return string.Format("{0:F5}", value);
            else if (decimalPlaces == 6)
                return string.Format("{0:F6}", value);
            else if (decimalPlaces == 7)
                return string.Format("{0:F7}", value);
            else
                return "0";
        }
        /// 
        /// 소수점 없는 String 값을 소수점 추가 후 String 값으로 리턴
        /// 
        /// 소수점이 없는 값
        /// 소수점 자릿수
        /// 소수점 자리 추가 데이터
        public static string StringToDecimalPlaces(string value, int decimalPlaces)
        {
            string ret = "";
            double dValue = 0.0;
            dValue = StringToDouble(value, decimalPlaces);
            ret = DoubleToString(dValue, decimalPlaces);
            return ret;
        }
        /// 
        /// 소수점 없는 String형 값을 소수점 추가후 Double형으로 리턴(부호가 포함된 String형값)
        /// 
        /// 소수점이 없는 값
        /// 소수점 자릿수
        /// Double형 소수점 추가 데이터
        public static double StringToDouble(string value, int decimalPlaces)
        {
            double dValue = 0.0;
            string str = "", code = "";
            StringBuilder sb = new StringBuilder();
            sb.Append(value);
            try
            {
                if (sb.Length > 8)
                    return 0.0;
                if (sb[0] == '-')
                {
                    code = "-";
                    sb.Remove(0, 1);
                }
                str = sb.ToString();
                str = str.Trim();
                sb.Remove(0, sb.Length);
                sb.Append(str);
                for (int i = 0; i < decimalPlaces; i++)
                {
                    if (sb.Length > decimalPlaces)
                        break;
                    sb.Insert(0, "0");
                }
                sb.Insert(sb.Length - decimalPlaces, ".");
                str = sb.ToString();
                str = code + str;
                dValue = double.Parse(str);
                return dValue;
            }
            catch
            {
                return 0.0;
            }
        }
        public static Define.E_ProcessStatus StringToProcessStatus(string value)
        {
            int iValue = 0;
            Define.E_ProcessStatus status;
            if (value.Length != 2)
                return Define.E_ProcessStatus._0_None;
            iValue = int.Parse(value);
            switch (iValue)
            {
                case 0:
                    status = Define.E_ProcessStatus._1_Ready;
                    break;
                case 1:
                    status = Define.E_ProcessStatus._2_ProductEntry;
                    break;
                case 2:
                    status = Define.E_ProcessStatus._3_MoveToLeak;
                    break;
                case 3:
                    status = Define.E_ProcessStatus._4_MoveToCheck;
                    break;
                case 4:
                    status = Define.E_ProcessStatus._5_ChamberMerge;
                    break;
                case 5:
                    status = Define.E_ProcessStatus._6_VacuumStart;
                    break;
                case 6:
                    status = Define.E_ProcessStatus._7_VacuumHold;
                    break;
                case 7:
                    status = Define.E_ProcessStatus._8_Judgment;
                    break;
                case 8:
                    status = Define.E_ProcessStatus._9_VacuumBreak;
                    break;
                case 9:
                    status = Define.E_ProcessStatus._10_ChamberRelease;
                    break;
                case 10:
                    status = Define.E_ProcessStatus._11_MoveToReady;
                    break;
                default:
                    status = Define.E_ProcessStatus._0_None;
                    break;
            }
            return status;
        }
        public static Define.E_JudgmentStatus StringToJudgmentStatus(string value)
        {
            Define.E_JudgmentStatus status;
            if (value.Length != 1)
                return Define.E_JudgmentStatus.None;
            switch (value)
            {
                case "0":
                    status = Define.E_JudgmentStatus.None;
                    break;
                case "1":
                    status = Define.E_JudgmentStatus.Pass;
                    break;
                case "2":
                    status = Define.E_JudgmentStatus.Ng;
                    break;
                case "3":
                    status = Define.E_JudgmentStatus.Empty;
                    break;
                case "4":
                    status = Define.E_JudgmentStatus.Error;
                    break;
                default:
                    status = Define.E_JudgmentStatus.None;
                    break;
            }
            return status;
        }
        /// 
        /// 2자리에 마춰 공백으로 채움
        /// 
        /// 
        /// 
        public static string StringBlankFillDigits2(string value)
        {
            if (value.Length == 1)
                return string.Format(" {0}", value);
            else if (value.Length == 2)
                return value;
            else
                return "  ";
        }
        /// 
        /// 4자리에 마춰 공백으로 채움
        /// 
        /// 
        /// 
        public static string StringBlankFillDigits4(string value)
        {
            if (value.Length == 1)
                return string.Format("   {0}", value);
            else if (value.Length == 2)
                return string.Format("  {0}", value);
            else if (value.Length == 3)
                return string.Format(" {0}", value);
            else if (value.Length == 4)
                return value;
            else
                return "    ";
        }
        /// 
        /// 5자리에 마춰 공백으로 채움
        /// 
        /// 
        /// 
        public static string StringBlankFillDigits5(string value)
        {
            if (value.Length == 1)
                return string.Format("    {0}", value);
            else if (value.Length == 2)
                return string.Format("   {0}", value);
            else if (value.Length == 3)
                return string.Format("  {0}", value);
            else if (value.Length == 4)
                return string.Format(" {0}", value);
            else if (value.Length == 5)
                return value;
            else
                return "     ";
        }
        /// 
        /// 6자리에 마춰 공백으로 채움
        /// 
        /// 
        /// 
        public static string StringBlankFillDigits6(string value)
        {
            if (value.Length == 1)
                return string.Format("     {0}", value);
            else if (value.Length == 2)
                return string.Format("    {0}", value);
            else if (value.Length == 3)
                return string.Format("   {0}", value);
            else if (value.Length == 4)
                return string.Format("  {0}", value);
            else if (value.Length == 5)
                return string.Format(" {0}", value);
            else if (value.Length == 6)
                return value;
            else
                return "      ";
        }
        /// 
        /// 7자리에 마춰 공백으로 채움
        /// 
        /// 
        /// 
        public static string StringBlankFillDigits7(string value)
        {
            if (value.Length == 1)
                return string.Format("      {0}", value);
            else if (value.Length == 2)
                return string.Format("     {0}", value);
            else if (value.Length == 3)
                return string.Format("    {0}", value);
            else if (value.Length == 4)
                return string.Format("   {0}", value);
            else if (value.Length == 5)
                return string.Format("  {0}", value);
            else if (value.Length == 6)
                return string.Format(" {0}", value);
            else if (value.Length == 7)
                return value;
            else
                return "       ";
        }
        /// 
        /// 8자리에 마춰 공백으로 채움
        /// 
        /// 
        /// 
        public static string StringBlankFillDigits8(string value)
        {
            if (value.Length == 1)
                return string.Format("       {0}", value);
            else if (value.Length == 2)
                return string.Format("      {0}", value);
            else if (value.Length == 3)
                return string.Format("     {0}", value);
            else if (value.Length == 4)
                return string.Format("    {0}", value);
            else if (value.Length == 5)
                return string.Format("   {0}", value);
            else if (value.Length == 6)
                return string.Format("  {0}", value);
            else if (value.Length == 7)
                return string.Format(" {0}", value);
            else if (value.Length == 8)
                return value;
            else
                return "        ";
        }
        /// 
        /// 4자리에 마춰 공백을 0으로 채움
        /// 
        /// 
        /// 
        public static string StringZeroFillDigits4(string value)
        {
            if (value.Length == 1)
                return string.Format("000{0}", value);
            else if (value.Length == 2)
                return string.Format("00{0}", value);
            else if (value.Length == 3)
                return string.Format("0{0}", value);
            else if (value.Length == 4)
                return value;
            else
                return "0000";
        }
        public static string ByteToHexString(byte[] array)
        {
            string resultHex = "";
            foreach (byte byteStr in array)
                resultHex += string.Format("{0:X2}", byteStr);
            return resultHex;
        }
    }
    public static class FindByNameUtil
    {
        public static T FindByName(this object targetClass, string name) where T : class
        {
            System.Reflection.FieldInfo fi = targetClass.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
            return fi.GetValue(targetClass) as T;
        }
        public static T FindByName(this string name, object targetClass) where T : class
        {
            System.Reflection.FieldInfo fi = targetClass.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
            return fi.GetValue(targetClass) as T;
        }
        public static System.Windows.Forms.Label Is_Label_From(this string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
        public static System.Windows.Forms.TextBox Is_TextBox_From(this string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
        public static System.Windows.Forms.TextBox TextBox(string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
        public static System.Windows.Forms.Label Label(string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
        public static System.Windows.Forms.PictureBox PictureBox(string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
        public static SmartX.SmartLabel SmartLabel(string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
        public static SmartX.SmartGroupBox SmartGroupBox(string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
        public static SmartX.SmartProgressBar SmartProgressBar(string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
        public static SmartX.SmartButton SmartButton(string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
        public static SmartX.SmartDraw SmartDraw(string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
        public static SmartX.SmartListBox SmartListBox(string name, object targetClass)
        {
            return FindByName(targetClass, name);
        }
    }
}