using apiwrappercli;
using Serilog;
using SPTrader.Common;
using SPTrader.Views;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Text;
using System.Windows;

namespace SPTrader.BusinessLayer
{
    public sealed class SPWebNavigator
    {
        private SPApiProxyWrapper apiProxy;
        private static readonly Lazy<SPWebNavigator> lazy = new Lazy<SPWebNavigator>(() => new SPWebNavigator());

        public static SPWebNavigator Instance { get { return lazy.Value; } }

        private string host_domain { get; set; }
        private string host { get; set; }
        private string host_best { get; set; }
        private int port { get; set; }
        private string system_id { get; set; }
        private int group { get; set; }
        private int lang { get; set; }
        private string ver { get; set; }
        private string rel { get; set; }
        private string key { get; set; }
        private string sso_token { get; set; }
        private long sso_time { get; set; }
        private string ae_id { get; set; }
        private string user_id { get; set; }
        private string acc_no { get; set; }
        private int app_id { get; set; }
        private double app_rel { get; set; }
        private int app_ver { get; set; }
        private string md5 { get; set; }
        private long time { get; set; }

        private SPWebNavigator()
        {
            apiProxy = SPCLI.Instance.ApiProxyWrapper;
            var conn_info = apiProxy.CoreService.GetConnectedServerHost(SPDataType.HOST_TC);

            host = conn_info.Host;
            host_best = Profiler.Instance.BestURL;
            lang = (int) apiProxy.GetLanguageId();
            ver = "1";
            rel = "8.78";
            time = CommonUtil.ToEpochTime(DateTime.Now);
            key = "";
            system_id = AppConstants.SP_FUTURES;
            sso_token = apiProxy.TradeContext.GetServerSsoToken();
            sso_time = apiProxy.TradeContext.GetServerAccountLoginTime();
            user_id = apiProxy.TradeContext.GetUserId();
            acc_no = apiProxy.TradeContext.GetAccNo();
        }

        public void OpenProcessUrl(string url)
        {
            try
            {
                Process.Start(url);
            }
            catch
            {
                // hack because of this: https://github.com/dotnet/corefx/issues/10361
                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    url = url.Replace("&", "^&");
                    Process.Start(new ProcessStartInfo("cmd", $"/c start {url}") { CreateNoWindow = true });
                }
                else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
                {
                    Process.Start("xdg-open", url);
                }
                else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
                {
                    Process.Start("open", url);
                }
                else
                {
                    throw;
                }
            }
        }

        public void OpenBrowserUrl(string url, string title)
        {
            var win = new SPWebBrowser();
            win.Title = title;
            win.ShowInTaskbar = false;
            win.Owner = Application.Current.MainWindow;
            win.Navigate(url);
            win.Show();
        }

        public void NavigateJavaScriptInterOpTest()
        {
            string url = JSWebCommon.GetWebPagePath("CSWebSampleInterop.html");
            OpenBrowserUrl(url, "HTML/JavaScript InterOp Test");
        }

        public void NavigateOrderLog()
        {
            port = 8000;

            string url = string.Format($"https://{host}:{port}/sptrader/user_order_log.php?lang={lang}&ver=" +
                $"{ver}&rel={rel}&time={time}&key=&system_id={system_id}&sso_token=&sso_time=" +
                $"&user_id={user_id}&acc_no={acc_no}");

            string tit = LanguageSetting.GetLanguageValue("ACCINFO_ORDERLOG");
            OpenBrowserUrl(url, tit);
        }

        public void NavigateCustomerService()
        {
            host = "uat1.spsystem.info";
            port = 9030;

            string url = string.Format($"http://{host}:{port}/sptraderadmin/jumper.html?lang={lang}&ver=" +
                $"{ver}&rel={rel}&time={time}&key=&system_id={system_id}&sso_token={sso_token}&sso_time={sso_time}" +
                $"&user_id={user_id}");

            string tit = LanguageSetting.GetLanguageValue("ACCINFO_CUSTOMERSERVICE");
            OpenBrowserUrl(url, tit);
        }

        public void NavigateProductDesc(string mkt, string inst, string prod)
        {
            string url = string.Format($"{host_best}/spinfo_old/prdt.php?lang={lang}&" +
                $"&market_code={mkt}&instmnt_code={inst}& prod_code={prod}");

            string tit = LanguageSetting.GetLanguageValue("PRICEMENU_PRODUCTDESC");
            tit = string.Format($"{tit} - {prod}");

            OpenBrowserUrl(url, tit);
        }

        public void NavigateUserManual()
        {
            string url = string.Format($"{host_best}/sphelp/content.php?lang={lang}");
            string tit = LanguageSetting.GetLanguageValue("SINGLEWIN_HELP");

            OpenBrowserUrl(url, tit);
        }

        public void NavigateUserManual(string helpid)
        {
            string url = string.Format($"{host_best}/sphelp/post.php?lang={lang}&help={helpid}");
            string tit = LanguageSetting.GetLanguageValue("SINGLEWIN_HELP");

            OpenBrowserUrl(url, tit);
        }

        public void NavigateWhatsNew()
        {
            string url = string.Format($"{host_best}/sphelp/post.php?lang={lang}&help=whatsnew#whatsnew");
            string tit = LanguageSetting.GetLanguageValue("SINGLEWIN_HELP");

            OpenBrowserUrl(url, tit);
        }

        public void NavigateELearning()
        {
            string url = string.Format($"{host_best}/helpManual/teach1.html?langid={lang}");
            string tit = LanguageSetting.GetLanguageValue("SINGLEWIN_TEACHINF");

            OpenBrowserUrl(url, tit);
        }
    }
}