using System;
using System.IO;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using vCloud.GeneratePackages.Entitys;
using vCloud.GeneratePackages.Utilities;
using Vinno.IUS.Common.Utilities;

namespace vCloud.GeneratePackages.Tool
{
    public class AppManager
    {

        private static AppManager _instance;
        private static ZipHelper _zipHelper;
        private static DescriptionUpdater _updater;
        private static string _appConfigFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AppSettings.cfg");
        private static string _ftpLocal = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FtpLocal");
        private static string _outputdir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Output");
        private static string _installPackagePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "InstallPackage");
        private static string _deploymentToolPath = Path.Combine(_installPackagePath, "DeploymentTool");
        private static string _outDeploymentToolPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DeploymentTool");
        private static string _deployPackage = Path.Combine(_outDeploymentToolPath, "DeployPackage");
        private Version _upgradePackagesVersion;
        private FlyinsonoVersionResult _languageInfoDes;

        /// <summary>
        /// The unique instance of app manager
        /// </summary>
        public static AppManager Instance => _instance ?? (_instance = new AppManager());

        /// <summary>
        /// Package client data in pak
        /// </summary>
        public bool PackageClientData{ get; set; }

        /// <summary>
        /// is need upload server package
        /// </summary>
        public bool IsNeedRemoteDeployment { get; set; }

        /// <summary>
        /// The main dispatcher
        /// </summary>
        public static Dispatcher MainDispatcher { get; set; }

        /// <summary>
        /// Support languages
        /// </summary>

        /// <summary>
        /// Zip file icon
        /// </summary>
        public BitmapImage ZipFileIcon { get; private set; }

        /// <summary>
        /// app Settings
        /// </summary>
        public AppSettings AppSettings { get; }

        private AppManager()
        {
            var content = File.ReadAllText(_appConfigFile);
            AppSettings = JsonHelper.DeserializerJsonResult<AppSettings>(content);
            _updater = new DescriptionUpdater();
            _upgradePackagesVersion = new Version();
            IsNeedRemoteDeployment = true;
        }

        //Save ftp Url
        public void SaveFtpUrl(string url)
        {
            AppSettings.FtpUrl = url;
            var content = JsonHelper.SerializerToJsonString<AppSettings>(AppSettings);
            File.WriteAllText(_appConfigFile, content);
        }

        /// <summary>
        /// Initialize
        /// </summary>
        public void Initialize()
        {
            var assembly = GetType().Assembly;
            var assemblyName = assembly.GetName().Name;
            var resourcePath = $"{assemblyName}.Images.compressed.png";
            var stream = assembly.GetManifestResourceStream(resourcePath);
            if (stream != null)
            {
                byte[] bytes = new byte[stream.Length];
                stream.Read(bytes, 0, bytes.Length);
                stream.Seek(0, SeekOrigin.Begin);
                var bitmapImage = new BitmapImage();
                bitmapImage.BeginInit();
                bitmapImage.StreamSource = new MemoryStream(bytes);
                bitmapImage.EndInit();
                ZipFileIcon = bitmapImage;
            }
            _zipHelper = new ZipHelper();
        }

        /// <summary>
        /// Do a modal action, user can not do other things before the action finished
        /// </summary>
        /// <param name="action"></param>
        /// <param name="description"></param>
        public static void DoModalAction(Action action, string description = null, string title = null, IDescriptionUpdater descriptionUpdater = null, Action contiueAction = null)
        {
            var modalActionWindow = new ModalActionWindow(action, descriptionUpdater, description, title);
            modalActionWindow.Owner = System.Windows.Application.Current.MainWindow;
            modalActionWindow.ShowDialog();
        }
    }
}