using BBWY.Client.APIServices;
using BBWY.Client.Models;
using BBWY.Client.Views.Setting;
using BBWY.Common.Models;
using GalaSoft.MvvmLight.Command;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace BBWY.Client.ViewModels
{
    public class ShopSettingViewModel : BaseVM, IDenpendency
    {
        private bool isValidated;
        private bool isLoading;
        private GlobalContext globalContext;
        private ShopService shopService;
        private PurchaseAccount purchaseAccount;
        private string managePwd;
        private decimal platformCommissionRatio;
        public PurchaseAccount PurchaseAccount { get => purchaseAccount; set { Set(ref purchaseAccount, value); } }

        public bool IsLoading { get => isLoading; set { Set(ref isLoading, value); } }
        public ICommand SaveCommand { get; set; }
        public string ManagePwd { get => managePwd; set { Set(ref managePwd, value); } }
        public decimal PlatformCommissionRatio { get => platformCommissionRatio; set { Set(ref platformCommissionRatio, value); } }

        public ShopSettingViewModel(GlobalContext globalContext, ShopService shopService)
        {
            this.globalContext = globalContext;
            this.shopService = shopService;
            SaveCommand = new RelayCommand(Save);
        }

        protected override void Load()
        {
            IsLoading = false;
            if (!string.IsNullOrEmpty(globalContext.User.Shop.ManagePwd))
            {
                var validatePwd = new ValidateManagePwd(globalContext.User.Shop.ManagePwd);
                if (validatePwd.ShowDialog() != true)
                    return;
            }
            isValidated = true;
            this.ManagePwd = globalContext.User.Shop.ManagePwd;
            this.PlatformCommissionRatio = (globalContext.User.Shop.PlatformCommissionRatio ?? 0.05M) * 100;
            this.PurchaseAccount = globalContext.User.Shop.PurchaseAccountList == null || globalContext.User.Shop.PurchaseAccountList.Count() == 0 ?
                                   new PurchaseAccount() :
                                   globalContext.User.Shop.PurchaseAccountList[0].Clone() as PurchaseAccount;

        }

        protected override void Unload()
        {
            this.PurchaseAccount = null;
            this.PlatformCommissionRatio = 0M;
            this.ManagePwd = string.Empty;
            this.isValidated = false;
        }

        private void Save()
        {
            if (!isValidated)
            {
                MessageBox.Show("店铺密码验证未通过", "保存店铺设置");
                return;
            }
            if (string.IsNullOrEmpty(PurchaseAccount.AppKey) ||
                string.IsNullOrEmpty(PurchaseAccount.AppSecret) ||
                string.IsNullOrEmpty(PurchaseAccount.AppToken) ||
                string.IsNullOrEmpty(PurchaseAccount.AccountName))
            {
                MessageBox.Show("采购信息不能为空", "保存店铺设置");
                return;
            }

            PurchaseAccount.AppKey = PurchaseAccount.AppKey.Trim();
            PurchaseAccount.AppSecret = PurchaseAccount.AppSecret.Trim();
            PurchaseAccount.AppToken = PurchaseAccount.AppToken.Trim();
            PurchaseAccount.AccountName = PurchaseAccount.AccountName.Trim();

            var p = PlatformCommissionRatio / 100;
            IsLoading = true;
            Task.Factory.StartNew(() => shopService.SaveShopSetting(globalContext.User.Shop.ShopId, ManagePwd, p, PurchaseAccount)).ContinueWith(r =>
            {
                IsLoading = false;
                var response = r.Result;
                if (!response.Success)
                {
                    App.Current.Dispatcher.Invoke(() => MessageBox.Show(response.Msg, "保存店铺设置"));
                    return;
                }

                if (globalContext.User.Shop.PurchaseAccountList == null)
                    globalContext.User.Shop.PurchaseAccountList = new List<PurchaseAccount>();
                globalContext.User.Shop.PurchaseAccountList.Clear();
                PurchaseAccount.Id = response.Data;
                globalContext.User.Shop.PurchaseAccountList.Add(PurchaseAccount);
                globalContext.User.Shop.PlatformCommissionRatio = p;
                globalContext.User.Shop.ManagePwd = this.ManagePwd;
            });
        }
    }
}