using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using Aitex.Common.Util;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.RecipeCenter;
using Aitex.Core.RT.SCCore;

namespace SicModules.PMs.RecipeExecutions
{
    public class SicRecipeFileContext : IRecipeFileContext
    {
        public string GetRecipeDefiniton(string chamberId, string module)
        {
            try
            {
                var recipeFormatNme = module.Contains("PM") ? GetRecipeFormat(module) : module;
                string recipeSchema = PathManager.GetCfgDir() + $@"\Recipe\{chamberId}\{recipeFormatNme}.xml";

                XmlDocument xmlDom = new XmlDocument();
                xmlDom.Load(recipeSchema);
                return xmlDom.OuterXml;
            }
            catch (Exception ex)
            {
                LOG.Write(ex);
                return "";
            }
        }

        public string GetRecipeFormat(string module)
        {
            var rName = "PN2DopingRecipe";

            var scValue = SC.GetStringValue($"PM.{module}.OperationView");
            if (String.IsNullOrEmpty(scValue))
                return rName;

            return scValue;
        }

        public string GetSingleNodePath(int sourceIndex, int gasIndex)
        {
            return $"/Aitex/TableRecipeFormat/Catalog[@DisplayName=\"Source{sourceIndex}\"]/Group/Step/Item[@ControlName=\"Gas{gasIndex}\"]";
        }

        public IEnumerable<string> GetRecipes(string path, bool includingUsedRecipe)
        {
            try
            {
                var recipes = new List<string>();
                string recipePath = PathManager.GetRecipeDir() + path + "\\";

                if (!Directory.Exists(recipePath))
                    return recipes;

                var di = new DirectoryInfo(recipePath);
                var fis = di.GetFiles("*.rcp", SearchOption.AllDirectories);


                foreach (var fi in fis)
                {
                    string str = fi.FullName.Substring(di.FullName.Length);
                    str = str.Substring(0, str.LastIndexOf('.'));
                    if (includingUsedRecipe || (!includingUsedRecipe && !str.Contains("HistoryRecipe\\")))
                    {
                        recipes.Add(str);
                    }
                }
                return recipes;
            }
            catch (Exception ex)
            {
                LOG.Write(ex);
                return new List<string>();
            }
        }

        public void PostInfoEvent(string message)
        {
            EV.PostMessage("System", EventEnum.GeneralInfo, message);
        }

        public void PostWarningEvent(string message)
        {
            EV.PostMessage("System", EventEnum.DefaultWarning, message);
        }

        public void PostAlarmEvent(string message)
        {
            EV.PostMessage("System", EventEnum.DefaultAlarm, message);
        }

        public void PostDialogEvent(string message)
        {
            EV.PostNotificationMessage(message);
        }

        public void PostInfoDialogMessage(string message)
        {
            EV.PostMessage("System", EventEnum.GeneralInfo, message);

            EV.PostPopDialogMessage(EventLevel.Information, "System Information", message);
        }

        public void PostWarningDialogMessage(string message)
        {
            EV.PostMessage("System", EventEnum.GeneralInfo, message);

            EV.PostPopDialogMessage(EventLevel.Warning, "System Warning", message);
        }

        public void PostAlarmDialogMessage(string message)
        {
            EV.PostMessage("System", EventEnum.GeneralInfo, message);

            EV.PostPopDialogMessage(EventLevel.Alarm, "System Alarm", message);
        }

        public string GetRecipeTemplate(string chamberId, string module)
        {
            string schema = GetRecipeDefiniton(chamberId, module);

            XmlDocument dom = new XmlDocument();

            dom.LoadXml(schema);

            XmlNode nodeTemplate = dom.SelectSingleNode("/Aitex/TableRecipeData");

            return nodeTemplate.OuterXml;
        }
    }
}
