using apiwrappercli;
using apiwrappercli.listener;
using apiwrappercli.spmessage.core;
using Microsoft.Win32;

using SciChart.Charting.Visuals;
using SPTrader.BusinessLayer;
using SPTrader.Common;
using SPTrader.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Threading;

using System.Windows;
using System.Windows.Controls;
using WpfStandaloneApp;
using WpfStandaloneApp.listener;
using WpfStandaloneApp.orderticket;

namespace SPTrader.Views
{
    /// <summary>
    /// Interaction logic for MainContainer.xaml
    /// </summary>
    public partial class MainSPTrame : SPBindableWindowChrome, SPApiProxyEventListener
    {
        private DaemonApiEventListener daemonApiEventListener;
        private MarginCallWindow marginCallWindow = null;
        private TwoFAWindow spAuthWindow = null;

        double parentOldTop = 0;
        double parentOldLeft = 0;

        private bool isAE = false;
        private string errMsg = string.Empty;
        private bool isLoggedIn = false;

        public MainSPTrame(string loginErrMsg)
        {
            InitializeComponent();
            //DataContext = this;

            daemonApiEventListener = new DaemonApiEventListener();
            errMsg = loginErrMsg;
        }

        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            ea.GetEvent<SwitchLanguageEvent>().Subscribe(OnLanguageChanged);
            ea.GetEvent<RefreshDesktopSubWindowEvent>().Subscribe(UpdateDesktopSubWindowItems);
            ea.GetEvent<SwitchColorThemeEvent>().Subscribe(OnColorThemeChanged);

            WindowState = WindowState.Maximized;

            apiProxy.CoreService.AddListener(this);
            apiProxy.OrderService.AddListener(daemonApiEventListener);

            this.parentOldLeft = this.Left;
            this.parentOldTop = this.Top;

            accountMenu.Visibility = Visibility.Collapsed;
            adminMenu.Visibility = Visibility.Collapsed;
            desktopMenu.Visibility = Visibility.Collapsed;
            helpMenu.Visibility = Visibility.Visible;
            oldMenu.Visibility = Visibility.Collapsed;

            PreloadSciChartResource();  // preload scichart resources
            ShowLoginWindow(errMsg);
        }

        private void OnLoggedIn()
        {
            DesktopSetting.Instance.IsLoggingOut = false;
            UpdateTitle();
            LoadDesktopWindows();
            UpdateDesktopSubWindowItems();
        }

        public override void SaveDesktop()
        {
        }

        private void UpdateTitle()
        {
            var prof = Profiler.Instance.CurrentLoggedInProfile;

            rtSpTitle.Text = string.Format($"{AppConstants.SPSYSTEM_TITLE} {AppConstants.SPSYSTEM_VERSION}");
            rtLoginId.Text = prof.User;
            rtLoginHost.Text = string.Format($"{prof.Host}:{prof.Port}");
            rtDateTime.Text = DateTime.Now.ToString("yyyy/MM/dd");           
        }

        private void OnColorThemeChanged(ColorThemeEnum color)
        {
            UpdateDesktopSubWindowItems();
        }

        private void OnLanguageChanged(LanguageEnum lang)
        {
            UpdateDesktopSubWindowItems();
        }

        private void LoadDesktopWindows()
        {
            SPBindableWindow window = null;
            var openWin = DesktopSetting.Instance.Load(SPCLI.Instance.GetUniqueLoggedInUserId());
            isAE = apiProxy.TradeContext.IsAEMode();

            foreach (var win in openWin)
            {
                var windowId = win.Key;
                var winName = win.Value;

                // re-open windows on login
                switch (winName)
                {
                    case DesktopSetting.MarketPriceWindow:          window = new MarketPriceWindow(windowId);       break;
                    case DesktopSetting.AccInfoWindow:              window = new AccInfoWindow(windowId);           break;
                    case DesktopSetting.TickerWindow:               window = new TickerWindow(windowId);            break;
                    case DesktopSetting.PriceDepthWindow:           window = new PriceDepthWindow(windowId);        break;
                    case DesktopSetting.EnterOrder:                 window = new EnterOrder(windowId);              break;
                    case DesktopSetting.OptionMasterWindow:         window = new OptionMasterWindow(windowId);      break;
                    case DesktopSetting.TradeStatisticsWindow:      window = new TradeStatisticsWindow(windowId);   break;
                    case DesktopSetting.ChartTickerWindow:          window = new ChartTickerWindow(windowId);       break;
                    case DesktopSetting.ChartIntradayWindow:        window = new ChartIntradayWindow(windowId);     break;
                    case DesktopSetting.ChartAnalysisProWindow:     window = new ChartAnalysisProWindow(windowId);  break;
                    case DesktopSetting.PlaceOrderWindow:           window = new PlaceOrderWindow(windowId);        break;
                    case DesktopSetting.MarketPlaceWindow:          window = new MarketPlaceWindow(windowId);       break;
                    default:                                        window = null;                                  break;
                }

                // re-open windows for AE account
                if (isAE && window == null)
                {
                    switch (winName)
                    {
                        // there can be only 1 margin call window
                        case DesktopSetting.MarginCallWindow:
                            {
                                if (marginCallWindow == null)
                                {
                                    window = new MarginCallWindow(windowId);
                                    marginCallWindow = window as MarginCallWindow;
                                }
                            }
                            break;

                        case DesktopSetting.MarginCheckWindow:      window = new MarginCheckWindow(windowId);       break;
                        case DesktopSetting.TradeConfirmWindow:     window = new TradeConfirmWindow(windowId);      break;
                        case DesktopSetting.OrderApprovalWindow:    window = new OrderApprovalWindow(windowId);     break;                            
                        default:                                    window = null;                                  break;
                    }
                }

                if (window != null)
                {
                    window.ShowInTaskbar = false;
                    window.Owner = this;
                    window.Show();
                }
            }

            // make sure some windows show
            MarginCallList_Click(null, null);
        }

        private void UpdateDesktopSubWindowItems()
        {
            // remove sub windows first
            var winItems = desktopMenu.Items.OfType<MenuItem>();
            foreach (var menu in winItems.ToList()) {
                if (menu != null && menu.Tag != null)
                    desktopMenu.Items.Remove(menu);                
            }

            // re-initialize sub-windows into menu list
            foreach (Window win in App.Current.Windows)
            {
                if (win is SPBindableWindow)    // SPBindableWindowChrome
                {
                    var spwin = win as SPBindableWindow;
                    if (spwin != this)
                    {
                        if (string.IsNullOrEmpty(spwin.Title))
                            continue;

                        var subWin = new MenuItem();
                        subWin.Header = spwin.Title;
                        subWin.Style = this.TryFindResource("MindSystemMenuItem") as Style;
                        subWin.Click += SubWin_Click;
                        subWin.Tag = spwin.windowId;
                        desktopMenu.Items.Add(subWin);
                    }
                }
            }
        }

        private void SubWin_Click(object sender, RoutedEventArgs e)
        {
            var subWin = sender as MenuItem;
            var winId = subWin.Tag.ToString();
            CenterFocusWindowById(winId);
        }

        private void CenterFocusWindowById(string windowId)
        {
            foreach (Window win in App.Current.Windows)
            {
                if (win is SPBindableWindow)
                {
                    var spwin = win as SPBindableWindow;
                    if (spwin != this)
                    {
                        if (spwin.windowId.Equals(windowId))
                        {
                            // center to screen
                            double screenWidth = SystemParameters.PrimaryScreenWidth;
                            double screenHeight = SystemParameters.PrimaryScreenHeight;
                            double windowWidth = spwin.Width;
                            double windowHeight = spwin.Height;
                            spwin.Left = (screenWidth / 2) - (windowWidth / 2);
                            spwin.Top = (screenHeight / 2) - (windowHeight / 2);

                            spwin.WindowState = WindowState.Normal;                            
                            spwin.Focus();
                            break;
                        }
                    }
                }
            }
        }

        private void OnClosing(object sender, CancelEventArgs e)
        {
            apiProxy.CoreService.RemoveListener(this);
            apiProxy.OrderService.RemoveListener(daemonApiEventListener);
            CloseChildWindows();
            Logout();
        }

        private void OnLocationChanged(object sender, EventArgs e)
        {
            foreach (Window win in this.OwnedWindows)
            {
                win.Top += (this.Top - parentOldTop);
                win.Left += (this.Left - parentOldLeft);
            }

            this.parentOldLeft = this.Left;
            this.parentOldTop = this.Top;
        }

        public void ShowSPAuthWindow()
        {
            if (spAuthWindow == null)
            {
                spAuthWindow = new TwoFAWindow();
                spAuthWindow.ShowInTaskbar = false;
                spAuthWindow.Owner = this;
                spAuthWindow.ShowDialog();
            }
        }

        private void CloseChildWindows()
        {
            foreach (Window win in App.Current.Windows)
            {
                if ((!win.IsFocused && win.Owner == this) || win is SPBindableWindow)
                {
                    if (win != this)
                        win.Close();
                }
            }
        }

        private void LockDesktopWindows()
        {
            foreach (Window win in App.Current.Windows)
            {
                if (win is SPBindableWindow)
                {
                    if (win != this)
                    {
                        var spwin = win as SPBindableWindow;
                        spwin.Hide();
                    }
                }
            }
        }

        private void UnLockDesktopWindows()
        {
            foreach (Window win in App.Current.Windows)
            {
                if (win is SPBindableWindow)
                {
                    var spwin = win as SPBindableWindow;

                    if (win != this && spwin.ActualWidth > 0 && spwin.ActualHeight > 0)
                        spwin.Show();
                }
            }
        }

        private void Logout()
        {
            DesktopSetting.Instance.IsLoggingOut = true;
            DesktopSetting.Instance.Save(SPCLI.Instance.GetUniqueLoggedInUserId());
            GlobalSettings.Instance.SaveSetting();

            CloseChildWindows();
            apiProxy.LogoutAll();

            accountMenu.Visibility = Visibility.Collapsed;
            adminMenu.Visibility = Visibility.Collapsed;
            statusMenu.Visibility = Visibility.Collapsed;
            desktopMenu.Visibility = Visibility.Collapsed;
            helpMenu.Visibility = Visibility.Visible;
            oldMenu.Visibility = Visibility.Collapsed;

            isLoggedIn = false;
        }

        //void MainContainer_SourceInitialized(object sender, EventArgs e)
        //{
        //    HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
        //    source.AddHook(new HwndSourceHook(WndProc));
        //}

        //private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        //{
        //    switch (msg)
        //    {
        //        case 0x00A3: /* WM_NCLBUTTONDBLCLK */
        //            {
        //                handled = true;  //prevent double click from maximizing the window.
        //            }
        //            break;
        //    }
        //    return IntPtr.Zero;
        //}

        private void UpdateConnectionStatus(ConnectionStatusInfo info)
        {
            var statusList = new List<ConnectionInfo>();

            statusList.Add(info.TransactionLink);
            statusList.Add(info.QuotePriceLink);
            statusList.Add(info.TickerLink);

            if (apiProxy.TradeContext.IsAEMode())
                statusList.Add(info.MarginCheckerLink);

            var found = statusList.Where(x => x.IsConnected == false);
            if (found.Count() > 0)
                btn_conn.Foreground = ColorThemeSetting.GetColorValue("DangerColor");
            else
                btn_conn.Foreground = ColorThemeSetting.GetColorValue("ConfirmColor");
        }

        public void OnTServerLoginReply(LoginReplyMessage message)
        {
        }

        public void OnTServerHostResponse(HostResponseMessage message)
        {
        }

        public void OnPServerLoginReply(LoginPServerReplyMessage message)
        {
        }

        public void OnForceLogoutPush(ForceLogoutPushMessage message)
        {
            if (message.reasonCode == 1)
            {
                DesktopSetting.Instance.Save(SPCLI.Instance.GetUniqueLoggedInUserId());
                GlobalSettings.Instance.SaveSetting();

                var dir = Directory.GetCurrentDirectory();
                var exe = dir + "\\sptrader.exe";

                // set up argument for new process [-e] is show error in login message
                string args = string.Format("-e \"{0}\"", message.reasonText);
                CommonUtil.StartProcess(exe, args);

                Environment.Exit(0);
            }
        }

        public void OnSwitchSystemUserListPush(SwitchSystemUserListPushMessage message)
        {
        }

        public void OnTServerDisabledMobileApi()
        {
        }

        public void OnBusinessDatePush(uint businessDate)
        {
        }

        public void OnDisclaimerUrlReady(HyperlinkPushMessage message)
        {
        }

        public void OnHyperlinkPush(HyperlinkPushMessage message)
        {
        }

        public void OnPasswordChangeReply(PasswordChangeReplyMessage message)
        {
        }

        public void OnUserMessagePush(UserMessage message)
        {
        }

        public void OnHeartbeatReceived(ushort hostType)
        {
        }

        public void OnUserChallengeNotification(UserChallengeNotificationMessage message)
        {
            Application.Current.Dispatcher.InvokeAsync((Action)delegate
            {
                bool isServerNewDevice = message.serverNewDevice;
                bool isClientNewDevice = !apiProxy.CoreService.IsRegisteredDevice();

                if (isClientNewDevice && !isServerNewDevice)
                {
                    apiProxy.CoreService.ResendUserChallengeRequest();
                    ShowSPAuthWindow();
                }
                else if (isClientNewDevice || isServerNewDevice)
                {
                    ShowSPAuthWindow();
                }
                else
                {
                    apiProxy.CoreService.SendStoredUserChallengeAnswerRequest();
                }
            });
        }

        public void OnUserChallengeAnswerReply(UserChallengeAnswerReplyMessage message)
        {
            Application.Current.Dispatcher.InvokeAsync((Action)delegate
            {
                if (message.returnCode != 0)
                {
                    if (spAuthWindow != null)
                    {
                        if (message.returnCode == SPErrorCode.ERR_2FA_TOO_MANY_WRONG_PSW)
                        {
                            MessageBoxResult result = MessageBox.Show(message.errMsg, "Authentication Error", MessageBoxButton.OK, MessageBoxImage.Error);
                            if (result == MessageBoxResult.OK)
                            {
                                Close();
                            }
                        }
                    }
                    else
                    {
                        ShowSPAuthWindow();
                    }
                }
            });
        }

        public void OnDeviceListReply(DeviceListReplyMessage message)
        {
        }

        public void OnUpdatedConnectionStatusInfo(ConnectionStatusInfo info)
        {
            btn_conn.Dispatcher.Invoke((Action)delegate
            {
                UpdateConnectionStatus(info);
            });
        }

        public void OnAlreadyConnected(int hostType)
        {
        }

        public void OnConnecting(int hostType)
        {
        }

        public void OnFailedToConnect(int hostType, SPConnectionException e)
        {
        }

        public void OnConnectionError(int hostType, SPConnectionException e, ulong lastHeartBeatSentTime)
        {
        }

        public void OnConnectSuccess(int hostType)
        {
        }

        private void AdvancedOrderMenuItem_Click(object sender, RoutedEventArgs e)
        {
            ShowAdvancedOrderTicket();
        }

        private void ConnectionStatusMenuItem_Click(object sender, RoutedEventArgs e)
        {
            ShowConnectionStatusWindow();
        }

        private void MarginCallListMenuItem_Click(object sender, RoutedEventArgs e)
        {
            ShowMarginCallListWindow();
        }
        private void MarginCheckMenuItem_Click(object sender, RoutedEventArgs e)
        {
            ShowMarginCheckWindow();
        }

        private void ShowAdvancedOrderTicket()
        {
            var win = new AddOrderWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void ShowConnectionStatusWindow()
        {
            var win = new ConnectionStatusWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void ShowMarginCallListWindow()
        {
            if (isAE)
            {
                var win = new MarginCallListWindow();
                win.ShowInTaskbar = false;
                win.Owner = this;
                win.Show();
            }
        }

        private void ShowApprovalOrderListWindow()
        {
            if (isAE)
            {
                var win = new ApprovalOrderListWindow();
                win.ShowInTaskbar = false;
                win.Owner = this;
                win.Show();
            }
        }

        private void ShowTradeConfirmationWindow()
        {
            if (isAE)
            {
                var win = new TradeConfirmationWindow();
                win.ShowInTaskbar = false;
                win.Owner = this;
                win.Show();
            }
        }

        private void ShowMarginCheckWindow()
        {
            if (isAE)
            {
                var win = new WpfStandaloneApp.MarginCheckWindow();
                win.ShowInTaskbar = false;
                win.Owner = this;
                win.Show();
            }
        }

        private void ApprovalOrderListMenuItem_Click(object sender, RoutedEventArgs e)
        {
            ShowApprovalOrderListWindow();
        }

        private void TradeConfirmationMenuItem_Click(object sender, RoutedEventArgs e)
        {
            ShowTradeConfirmationWindow();
        }

        private void OnLight_Click(object sender, RoutedEventArgs e)
        {
            SPGlobal.SetColorTheme(ColorThemeEnum.LIGHT);
            GlobalSettings.Instance.ColorThemeEnum = ColorThemeEnum.LIGHT;
            ea.GetEvent<SwitchColorThemeEvent>().Publish(ColorThemeEnum.LIGHT);
        }

        private void OnDark_Click(object sender, RoutedEventArgs e)
        {
            SPGlobal.SetColorTheme(ColorThemeEnum.DARK);
            GlobalSettings.Instance.ColorThemeEnum = ColorThemeEnum.DARK;
            ea.GetEvent<SwitchColorThemeEvent>().Publish(ColorThemeEnum.DARK);
        }

        private void OnEng_Click(object sender, RoutedEventArgs e)
        {
            SPGlobal.SetLanguage(LanguageEnum.ENG);
            GlobalSettings.Instance.LanguageEnum = LanguageEnum.ENG;
            SPCLI.Instance.SwitchLanguage(LanguageEnum.ENG);
            ea.GetEvent<SwitchLanguageEvent>().Publish(LanguageEnum.ENG);
        }

        private void OnChiTrad_Click(object sender, RoutedEventArgs e)
        {
            SPGlobal.SetLanguage(LanguageEnum.TCHI_UNICODE);
            GlobalSettings.Instance.LanguageEnum = LanguageEnum.TCHI_UNICODE;
            SPCLI.Instance.SwitchLanguage(LanguageEnum.TCHI_UNICODE);
            ea.GetEvent<SwitchLanguageEvent>().Publish(LanguageEnum.TCHI_UNICODE);
        }

        private void OnChiSimp_Click(object sender, RoutedEventArgs e)
        {
            SPGlobal.SetLanguage(LanguageEnum.SCHI_UNICODE);
            GlobalSettings.Instance.LanguageEnum = LanguageEnum.SCHI_UNICODE;
            SPCLI.Instance.SwitchLanguage(LanguageEnum.SCHI_UNICODE);
            ea.GetEvent<SwitchLanguageEvent>().Publish(LanguageEnum.SCHI_UNICODE);
        }

        private void ExitMenuItem_Click(object sender, RoutedEventArgs e)
        {
            Logout();
            Close();
        }

        private void PreloadSciChartResource()
        {
            // preload SciChart resources so subsequent charts load faster
            using (new SciChartSurface()) { }
        }

        private void ShowLoginWindow(string msg)
        {
            var win = new LoginWindow(msg);

            win.ShowInTaskbar = false;
            win.Owner = this;
            isLoggedIn = (bool) win.ShowDialog();

            if (isLoggedIn == true)
            {
                accountMenu.Visibility = Visibility.Visible;
                desktopMenu.Visibility = Visibility.Visible;
                helpMenu.Visibility = Visibility.Collapsed;
                oldMenu.Visibility = Visibility.Visible;

                isAE = apiProxy.TradeContext.IsAEMode();

                if (isAE)
                    adminMenu.Visibility = Visibility.Visible;

                OnLoggedIn();
            }            
        }

        private void OnLogin_Click(object sender, RoutedEventArgs e)
        {
            if (isLoggedIn == true) 
                return;

            ShowLoginWindow(string.Empty);
        }

        private void OnLogout_Click(object sender, RoutedEventArgs e)
        {
            Logout();
        }

        private void DeviceManagementMenuItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new DeviceListWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void AccInfoMenuItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new AccInfoWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void EnterOrderMenuItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new PlaceOrderWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void OnChangePassword_Click(object sender, RoutedEventArgs e)
        {
            var win = new ChangePassword();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.ShowDialog();
        }

        private void MarketPriceMenuItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new MarketPriceWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void TickerMenuItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new TickerWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void QuotePriceMenuItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new QuotePrice();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void OrderTradeMenuItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new OrderTradeWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void PriceDepthMenuItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new PriceDepthWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void MarginCheck_Click(object sender, RoutedEventArgs e)
        {   
            if (isAE)
            {
                var win = new MarginCheckWindow();
                win.ShowInTaskbar = false;
                win.Owner = this;
                win.Show();
            }           
        }

        private void MarginCallList_Click(object sender, RoutedEventArgs e)
        {
            if (!isAE) return;

            // there can be only 1 margin call window
            if (marginCallWindow == null)
            {
                marginCallWindow = new MarginCallWindow();
                marginCallWindow.ShowInTaskbar = false;
                marginCallWindow.Owner = this;
                marginCallWindow.Show();
            }
            else
            {
                marginCallWindow.Show();
                marginCallWindow.Focus();
            }
        }

        private void ApprovalOrderList_Click(object sender, RoutedEventArgs e)
        {
            if (isAE)
            {
                var win = new OrderApprovalWindow();
                win.ShowInTaskbar = false;
                win.Owner = this;
                win.Show();
            }           
        }

        private void TradeConfirmation_Click(object sender, RoutedEventArgs e)
        {
            if (isAE)
            {
                var win = new TradeConfirmWindow();
                win.ShowInTaskbar = false;
                win.Owner = this;
                win.Show();
            }
        }

        private void SaveDesktop_Click(object sender, RoutedEventArgs e)
        {
            // save the current desktop instance to LAST SNAPSHOT
            foreach (Window win in App.Current.Windows)
            {
                if (win is SPBindableWindow)
                {
                    var spwin = win as SPBindableWindow;
                    spwin.SaveDesktop();
                }
            }
            DesktopSetting.Instance.Save(SPCLI.Instance.GetUniqueLoggedInUserId());

            var fd = new SaveFileDialog();

            fd.DefaultExt = ".sdt";
            fd.InitialDirectory = Path.GetFullPath(SPGlobal.DATA_DIR);
            fd.Filter = "Desktop File|*.sdt";
            bool? res = fd.ShowDialog();

            if (res == true)
            {               
                File.WriteAllText(fd.FileName, "");

                var filename = Path.GetFileNameWithoutExtension(fd.FileName);
                var newfilename = string.Format(@"spdesktop_{0}.db", filename);

                var fullpathname = SPGlobal.DATA_DIR + newfilename;
                File.Copy(SPGlobal.DB_PATH, fullpathname);
            }
        }

        private void LoadDesktop_Click(object sender, RoutedEventArgs e)
        {
            var fd = new OpenFileDialog();

            fd.DefaultExt = ".sdt";
            fd.InitialDirectory = Path.GetFullPath(SPGlobal.DATA_DIR);
            fd.Filter = "Desktop File|*.sdt";
            bool? res = fd.ShowDialog();

            if (res == true)
            {
                DesktopSetting.Instance.IsLoadingPreviousDB = true;                     
                CloseChildWindows();
                DesktopSetting.Instance.ClearWindows();
                DesktopSetting.Instance.Terminate();    // close all connections, release file handle lock
                File.Delete(SPGlobal.DB_PATH);

                var filename = Path.GetFileNameWithoutExtension(fd.FileName);
                var newfilename = string.Format(@"spdesktop_{0}.db", filename);
                var fullpathname = SPGlobal.DATA_DIR + newfilename;

                Thread.Sleep(50);                       // add some lead time for OS to properly delink file
                File.Copy(fullpathname, SPGlobal.DB_PATH);
                Thread.Sleep(50);                       // add some lead time for OS to properly establish file
                DesktopSetting.Instance.Initialize();   // open and connect to all db
                LoadDesktopWindows();
                DesktopSetting.Instance.IsLoadingPreviousDB = false;
            }
        }

        private void OptionMasterItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new OptionMasterWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void StrategyItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new StrategyList();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.ShowDialog();
        }

        private void SPCustomWindowChrome_Click(object sender, RoutedEventArgs e)
        {
            var win = new SPTestCustomWindowChrome();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void OnDeviceList_Click(object sender, RoutedEventArgs e)
        {
            var win = new DeviceList();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void OnConnectionStatus_Click(object sender, RoutedEventArgs e)
        {
            var win = new ConnectionStatusWin();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void OnUserManual_Click(object sender, RoutedEventArgs e)
        {
            SPWebNavigator.Instance.NavigateUserManual();
        }

        private void OnELearning_Click(object sender, RoutedEventArgs e)
        {
            SPWebNavigator.Instance.NavigateELearning();
        }

        private void OnWhatsNew_Click(object sender, RoutedEventArgs e)
        {
            SPWebNavigator.Instance.NavigateWhatsNew();
        }

        private void TradeStatistics_Click(object sender, RoutedEventArgs e)
        {
            var win = new TradeStatisticsWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void IntradayChart_Click(object sender, RoutedEventArgs e)
        {
            var win = new ChartIntradayWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void TickerChart_Click(object sender, RoutedEventArgs e)
        {
            var win = new ChartTickerWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void JavaScriptInterOp_Click(object sender, RoutedEventArgs e)
        {
            var win = new WebBrowserJSInterOpTest();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();          
        }

        private void EnterOrder_Click(object sender, RoutedEventArgs e)
        {
            var win = new EnterOrder();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void ChartProTA_Click(object sender, RoutedEventArgs e)
        {
            var win = new ChartAnalysisProWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void ChartProAnno_Click(object sender, RoutedEventArgs e)
        {
            var win = new ChartAnnotationWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        public void OnTargetPositionReply(TargetPositionReplyMessage message)
        {
        }

        public void OnTargetPositionUpdate(TargetPositionUpdateMessage message)
        {
        }

        private void ChangeCreditLimit_Click(object sender, RoutedEventArgs e)
        {
            var acc = apiProxy.TradeContext.GetAccNo();
            if (string.IsNullOrEmpty(acc))
                return;

            var win = new ChangeDialog(AdminChangeMode.CHANGE_CREDIT_LIM);
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.ShowDialog();
        }

        private void ChangeMaxMargin_Click(object sender, RoutedEventArgs e)
        {
            var acc = apiProxy.TradeContext.GetAccNo();
            if (string.IsNullOrEmpty(acc))
                return;

            var win = new ChangeDialog(AdminChangeMode.CHANGE_MAX_MARGIN);
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.ShowDialog();
        }

        private void OnAbout_Click(object sender, RoutedEventArgs e)
        {
            var win = new AboutDialog();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.ShowDialog();
        }

        private void OnDisclaimer_Click(object sender, RoutedEventArgs e)
        {
            var win = new DisclaimerDialog();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.ShowDialog();
        }

        private void OnComputerClock_Click(object sender, RoutedEventArgs e)
        {
            var win = new ComputerClock();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void OnLockDesktop_Click(object sender, RoutedEventArgs e)
        {
            LockDesktopWindows();

            var win = new LockDesktop();
            win.ShowInTaskbar = false;
            win.Owner = this;
            
            if (win.ShowDialog() == true)
            {
                UnLockDesktopWindows();
            }
        }

        private void ChartAnalysis_Click(object sender, RoutedEventArgs e)
        {
            var win = new ChartAnalysisWindow();
            win.ShowInTaskbar = false;
            win.Owner = Application.Current.MainWindow;
            win.Show();
        }

        private void ChartAnnotation_Click(object sender, RoutedEventArgs e)
        {
            var win = new ChartAnnotationWindow();
            win.ShowInTaskbar = false;
            win.Owner = Application.Current.MainWindow;
            win.Show();
        }

        private void WebView2Chart_Click(object sender, RoutedEventArgs e)
        {
            var win = new SPWebView2();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Navigate("TradingViewWidget.html");
            win.Show();
        }

        private void TradingView1_Click(object sender, RoutedEventArgs e)
        {
            var win = new SPWebView2();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Navigate("TradingViewSample1.html");
            win.Show();
        }

        private void TradingView2_Click(object sender, RoutedEventArgs e)
        {
            var win = new SPWebView2();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Navigate("TradingViewSample2.html");
            win.Show();
        }

        private void TradingView3_Click(object sender, RoutedEventArgs e)
        {
            var win = new SPWebView2();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Navigate("TradingViewSample3.html");
            win.Show();
        }

        private void MarketPlaceItem_Click(object sender, RoutedEventArgs e)
        {
            var win = new MarketPlaceWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }

        private void UITest_Click(object sender, RoutedEventArgs e)
        {
            var win = new UITestWindow();
            win.ShowInTaskbar = false;
            win.Owner = this;
            win.Show();
        }
    }
}