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

namespace Project
{
    public static class Lang
    {
        ////main
        public static string OK { get; set; }
        public static string Q_EXIT { get; set; }
        public static string ERROR { get; set; }
        public static string NO { get; set; }
        public static string YES { get; set; }

        public static string MENU_RESET { get; set; }
        public static string MENU_LOGIN { get; set; }
        public static string MENU_LOGOUT { get; set; }
        public static string MENU_RESULT { get; set; }
        public static string MENU_MODELEDIT { get; set; }
        public static string MENU_SETUP { get; set; }

        public static string RESULT { get; set; }
        public static string LOG { get; set; }
        public static string HISTORY { get; set; }

        public static string NOT_READY { get; set; }
        public static string CAN_NOT_RUN_AUTOMODE { get; set; }

        public static string m_오류_AIROFF { get; set; }
        public static string m_오류_AIRDETECT { get; set; }
        public static string m_오류_SAFTYAREA { get; set; }
        public static string m_오류_REQUIRELOTLIST { get; set; }
        public static string m_진행중 { get; set; }
        public static string m_준비완료 { get; set; }

        public static string m_트레이로드 { get; set; }
        public static string m_시작조건검사 { get; set; }
        public static string m_시작조건프로그램 { get; set; }
        public static string m_시작조건장치 { get; set; }
        public static string m_카메라촬영 { get; set; }
        public static string m_이미지수집 { get; set; }
        public static string m_비젼검사_원점 { get; set; }
        public static string m_비젼검사_DOT { get; set; }
        public static string m_LASERMARKING { get; set; }
        public static string m_AIRBLOW { get; set; }
        public static string m_트레이언로드 { get; set; }
        
        public static void CreateFile()
        {
            //utf8파일로 파일을 생성한다.
            //if (System.IO.File.Exists(FileName)) System.IO.File.Delete(FileName);
            iniHelper.CreateFile(); //System.IO.File.WriteAllText(FileName, "//INI FILE", System.Text.Encoding.Unicode);

            int i = 1;
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.Q_EXIT);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.OK);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.ERROR);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.NO);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.YES);
            
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.MENU_RESULT);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.MENU_LOGOUT);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.MENU_LOGIN);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.MENU_MODELEDIT);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.MENU_SETUP);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.MENU_RESET);

            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.RESULT);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.LOG);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.HISTORY);

            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.NOT_READY);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.CAN_NOT_RUN_AUTOMODE);

            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_오류_AIROFF);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_오류_AIRDETECT);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_오류_SAFTYAREA);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_오류_REQUIRELOTLIST);

            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_진행중);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_준비완료);

            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_트레이로드);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_시작조건검사);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_시작조건프로그램);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_시작조건장치);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_카메라촬영);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_이미지수집);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_비젼검사_원점 );
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_비젼검사_DOT );
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_LASERMARKING );
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_AIRBLOW);
            SetINIValue(string.Format("MSG{0:0000}", i++), Lang.m_트레이언로드);

            iniHelper.Flush();
        }

        public static bool Loading(string langName)
        {
            Lang.SelectedLang = langName;
             iniHelper = new arUtil.INIHelper(FileName);

            int i = 1;

            Lang.Q_EXIT = GetINIValue(string.Format("MSG{0:0000}", i++), "종료하시겠습니까?");
            Lang.OK = GetINIValue(string.Format("MSG{0:0000}", i++), "확인");
            Lang.ERROR = GetINIValue(string.Format("MSG{0:0000}", i++), "오류");
            Lang.NO = GetINIValue(string.Format("MSG{0:0000}", i++), "아니오");
            Lang.YES = GetINIValue(string.Format("MSG{0:0000}", i++), "예");

            Lang.MENU_RESULT = GetINIValue(string.Format("MSG{0:0000}", i++), "History");
            Lang.MENU_LOGOUT = GetINIValue(string.Format("MSG{0:0000}", i++), "Logout");
            Lang.MENU_LOGIN = GetINIValue(string.Format("MSG{0:0000}", i++), "Login");
            Lang.MENU_MODELEDIT = GetINIValue(string.Format("MSG{0:0000}", i++), "Model Editor");
            Lang.MENU_SETUP = GetINIValue(string.Format("MSG{0:0000}", i++), "Setting");
            Lang.MENU_RESET = GetINIValue(string.Format("MSG{0:0000}", i++), "Clear");

            Lang.RESULT = GetINIValue(string.Format("MSG{0:0000}", i++), "Result");
            Lang.LOG = GetINIValue(string.Format("MSG{0:0000}", i++), "Log");
            Lang.HISTORY = GetINIValue(string.Format("MSG{0:0000}", i++), "History");
            Lang.NOT_READY = GetINIValue(string.Format("MSG{0:0000}", i++), "Input sensor condition not completed.");

            Lang.CAN_NOT_RUN_AUTOMODE = "AUTO-RUN MODE{n}[자동실행] 중에는 사용할 수 없습니다{n}중지 후 다시 시도하세요";
            Lang.m_오류_AIROFF = GetINIValue(string.Format("MSG{0:0000}", i++), "AIR OFF{n}AIR 공급상태가 [OFF] 입니다{n}전면의 [AIR S/W]를 누르세요{n}출력포트 : Y004");
            Lang.m_오류_AIRDETECT = GetINIValue(string.Format("MSG{0:0000}", i++), "AIR NOT DETECTED{n}장비 전면커버를 열고 AIR 감지 센서의 출력을 확인합니다{n}감지센서 : X005");
            Lang.m_오류_SAFTYAREA = GetINIValue(string.Format("MSG{0:0000}", i++), "SAFTY AREA SENSOR ERROR{n}매거진 투입구 안전 센서가 감지되었습니다{n}감지센서 : X00A");
            Lang.m_오류_REQUIRELOTLIST = GetINIValue(string.Format("MSG{0:0000}", i++), "REQUIRE LOT-LIST{n}LOT 목록이 조회 되어야 합니다{n}바코드를 이용하여 A/L TAG를 입력하세요");
            Lang.m_진행중 = GetINIValue(string.Format("MSG{0:0000}", i++), "진행 중");
            Lang.m_준비완료 = GetINIValue(string.Format("MSG{0:0000}", i++), "준비 완료");

            Lang.m_트레이로드 = GetINIValue(string.Format("MSG{0:0000}", i++), "TRAY LOAD");
            Lang.m_시작조건검사 = GetINIValue(string.Format("MSG{0:0000}", i++), "CHECK INIT");
            Lang.m_시작조건프로그램 = GetINIValue(string.Format("MSG{0:0000}", i++), "CHECK S/W");
            Lang.m_시작조건장치 = GetINIValue(string.Format("MSG{0:0000}", i++), "CHECK H/W");
            Lang.m_카메라촬영 = GetINIValue(string.Format("MSG{0:0000}", i++), "CAMERA ON");
            Lang.m_이미지수집 = GetINIValue(string.Format("MSG{0:0000}", i++), "GRAB IMAGE");
            Lang.m_비젼검사_원점 = GetINIValue(string.Format("MSG{0:0000}", i++), "IMAGE(ORIGNE)");
            Lang.m_비젼검사_DOT = GetINIValue(string.Format("MSG{0:0000}", i++), "IMAGE(DOT)");
            Lang.m_LASERMARKING = GetINIValue(string.Format("MSG{0:0000}", i++), "LASER MARKING");
            Lang.m_AIRBLOW = GetINIValue(string.Format("MSG{0:0000}", i++), "AIR BLOW");
            Lang.m_트레이언로드 = GetINIValue(string.Format("MSG{0:0000}", i++), "TRAY UNLOAD");

            Type thClass = typeof(Lang);

            foreach (var method in thClass.GetMethods())
            {
                var parameters = method.GetParameters();
                if (method.Name.StartsWith("get_m_")==false) continue;
                //set은 사용하지 않는다.

                //key
                string keyname = method.Name.Substring(4);
                string methodName = method.Name;
                string valuetype = method.ReturnType.Name.ToLower();
                var odata = thClass.GetMethod(methodName).Invoke(null, null).ToString();
                if(odata.Contains("{n}"))
                {
                    var ndata = odata.Replace("{n}", "\n");
                    thClass.GetMethod("set_" + keyname).Invoke(thClass, new object[] { ndata });
                }
            }
            //171104 없다면 생성
            if (!isExist()) CreateFile();
            return true;
        }

        #region "Common "

        public static Boolean ReLoad()
        {
            return Loading(SelectedLang);
        }
        private static arUtil.INIHelper iniHelper;
        private static string GetINIValue(string key, string def = "")
        {
            if (!System.IO.File.Exists(Lang.FileName))
                return def;

            string retval = iniHelper.get_Data("lang", key, def);
            return retval;
        }
        private static void SetINIValue(string key, string value)
        {
            iniHelper.set_Data("lang", key, value);
        }
        public static Boolean isExist()
        {
            return System.IO.File.Exists(FileName);
        }

        ////local data
        private static string _path = "";
        private static string _selectedLang = "";
        public static string SelectedLang
        {
            get
            {
                if ((string.IsNullOrWhiteSpace(_selectedLang)))
                {
                    return "kor";
                }
                else
                {
                    string fullname = Path + "\\" + _selectedLang + ".ini";
                    //if ((!System.IO.File.Exists(fullname)))
                    //{
                    //    CreateFile();
                    //}
                    return _selectedLang;
                }
            }
            set { _selectedLang = value; }
        }
        public static string Path
        {
            get
            {
                if (string.IsNullOrWhiteSpace(_path))
                {
                    _path = AppDomain.CurrentDomain.BaseDirectory + "\\Language";
                    if (!System.IO.Directory.Exists(_path)) System.IO.Directory.CreateDirectory(_path);
                }
                return _path;
            }
            set { _path = value; }
        }
        public static List<string> LangList
        {
            get
            {
                List<string> retval = new List<string>();
                if ((System.IO.Directory.Exists(Path)))
                {
                    string[] files = System.IO.Directory.GetFiles(Path, "*.ini");
                    foreach (string file in files)
                    {
                        retval.Add(file.Substring(file.LastIndexOf("\\") + 1));
                    }
                }
                return retval;
            }
        }
        public static string FileName
        {
            get
            {
                string fn = Path + "\\" + SelectedLang;
                if(fn.ToLower().LastIndexOf(".ini") == -1) fn += ".ini";
                return fn.Replace("\\\\", "\\");
            }
        }
        #endregion


    }
}

