autoImport('UITableListCtrl')
autoImport('UIModelMonthlyVIP')
autoImport('UIModelZenyShop')
autoImport('UIListItemViewControllerVIPDescription')
autoImport('UIListItemModelVIPDescription')
autoImport('UIListItemViewControllerItem')
autoImport('UIPriceDiscount')
autoImport('FunctionADBuiltInTyrantdb')
autoImport('FuncZenyShop')
autoImport('PurchaseDeltaTimeLimit')

UISubViewControllerMonthlyVIP = class('UISubViewControllerMonthlyVIP', SubView)

UISubViewControllerMonthlyVIP.instance = nil

local gReusableTable = {}

function UISubViewControllerMonthlyVIP:Init()

end

function UISubViewControllerMonthlyVIP:OnExit()
	self:CancelListenServerResponse()
end

function UISubViewControllerMonthlyVIP:MyInit()
	UISubViewControllerMonthlyVIP.instance = self
	
	self.gameObject = self:LoadPreferb('view/UISubViewMonthlyVIP', nil, true)
	self:GetGameObjects()
	self:RegisterButtonClickEvent()
	self:RegisterClickEvent()

	self:GetModelSet()
	FuncZenyShop.Instance():AddProductPurchase(self.monthlyVIPShopItemConf.ProductID, function ()
		self:OnClickForButtonPurchaseCard(0)
	end)
	EventManager.Me():PassEvent(ZenyShopEvent.CanPurchase, self.monthlyVIPShopItemConf.ProductID)
	for i = 1, #self.epVIPCards do
		local epVIPCard = self.epVIPCards[i]
		local productConfID = epVIPCard.id2
		if(productConfID == nil or productConfID == 0)then
			productConfID = epVIPCard.id1;
		end
		local productID = Table_Deposit[productConfID].ProductID
		FuncZenyShop.Instance():AddProductPurchase(productID, function ()
			self:OnClickForButtonPurchaseCard(i)
		end)
		EventManager.Me():PassEvent(ZenyShopEvent.CanPurchase, productID)
	end

	self.showCardIndex = 0
	self.showContentIndex = 1
	self:LoadView()
	self:ListenServerResponse()
	self.isInit = true
end

function UISubViewControllerMonthlyVIP:GetVipCardId(card)
	if(card == nil)then
		return nil;
	end
	if(card.id2 ~= nil and card.id2 ~= 0)then
		return card.id2;
	end
	return card.id1;
end

function UISubViewControllerMonthlyVIP:GetGameObjects()
	self.goMonthlyVIPDesp = self:FindGO('MonthlyVIPDesp', self.gameObject)
	self.goDescriptionsList = self:FindGO('DescriptionsList', self.goMonthlyVIPDesp)
	self.goDescriptionsRoot = self:FindGO('DescriptionsRoot', self.goMonthlyVIPDesp)
	self.goListArrow = self:FindGO('Arrow', self.goMonthlyVIPDesp)
	self.goCard = self:FindGO('Card', self.gameObject)
	self.texCard = self.goCard:GetComponent(UITexture)
	self.goBoardM = self:FindGO('Board_MonthlyVIPCard', self.gameObject)
	self.goBoardE = self:FindGO('Board_EPVIPCard', self.gameObject)
	self.goBoard1E = self:FindGO('Board1_EPVIPCard', self.gameObject)
	self.goValidTime = self:FindGO('ValidTime', self.gameObject)
	self:Hide(self.goValidTime)-- 廢棄
	-- self.goLabValidTime = self:FindGO('Lab', self.goValidTime)
	-- self.labValidTime = self.goLabValidTime:GetComponent(UILabel)
	self.goBTNPurchaseMonthlyVIP = self:FindGO('BTN_Purchase', self.gameObject)
	self.goBTNTitlePurchaseMonthlyVIP = self:FindGO('Title', self.goBTNPurchaseMonthlyVIP)
	self.labBTNTitlePurchaseMonthlyVIP = self.goBTNTitlePurchaseMonthlyVIP:GetComponent(UILabel)

	self.goTip = self:FindGO('Tip', self.gameObject)
	self.goExpirationTime = self:FindGO('ExpirationTime', self.gameObject)
	self.labExpirationTime = self.goExpirationTime:GetComponent(UILabel)
	self.goYearAndMonth = self:FindGO('YearAndMonth', self.gameObject)
	self.goLabYear = self:FindGO('Year', self.goYearAndMonth)
	self.labYear = self.goLabYear:GetComponent(UILabel)
	self.goMonth = self:FindGO('Month', self.goYearAndMonth)
	self.goLabMonth = self:FindGO('Lab', self.goMonth)
	self.labMonth = self.goLabMonth:GetComponent(UILabel)
	self.goEPVIPReward = self:FindGO('EPVIPReward', self.gameObject)
	self.goRewardList = self:FindGO('ItemsList', self.goEPVIPReward)
	self.goRewardRoot = self:FindGO('ItemsRoot', self.goEPVIPReward)
	self.goBTN_LeftPage = self:FindGO('BTN_LeftPage', self.gameObject)
	self.goBGBTN_LeftPage = self:FindGO('BG', self.goBTN_LeftPage)
	self.goBTN_RightPage = self:FindGO('BTN_RightPage', self.gameObject)
	self.goBGBTN_RightPage = self:FindGO('BG', self.goBTN_RightPage)
	self.goBCForScrollDesp = self:FindGO('BCForScroll', self.goMonthlyVIPDesp)
	self.goBCForScrollReward = self:FindGO('BCForScroll', self.goEPVIPReward)
	self.goEPNumber = self:FindGO('EPNumber', self.goBoard1E)
	self.labEP = self.goEPNumber:GetComponent(UILabel)

	self.goDiscount = self:FindGO('Discount')
	self.goPercent = self:FindGO('Percent', self.goDiscount)
	self.spPercentBG = self:FindGO('BG', self.goPercent):GetComponent(UISprite)
	self.labPercent = self:FindGO('Value1', self.goPercent):GetComponent(UILabel)
	self.labPercentSymbol = self:FindGO('Value2', self.goPercent):GetComponent(UILabel)

	self.goOriginPrice = self:FindGO('OriginPrice')
	self.labOriginPrice = self:FindGO('Lab', self.goOriginPrice):GetComponent(UILabel)
end

function UISubViewControllerMonthlyVIP:RegisterButtonClickEvent()
	self:AddClickEvent(self.goBTNPurchaseMonthlyVIP, function ()
		self:OnClickForButtonPurchaseCard()
	end)
	self:AddClickEvent(self.goBGBTN_LeftPage, function ()
		self:OnClickForButtonLeftPage()
	end)
	self:AddClickEvent(self.goBGBTN_RightPage, function ()
		self:OnClickForButtonRightPage()
	end)
end

function UISubViewControllerMonthlyVIP:RegisterClickEvent()
	self:AddClickEvent(self.goCard, function ()
		self:OnClickForViewCard()
	end)
	self:AddClickEvent(self.goBCForScrollDesp, function ()
		self:ShowCard(self.showCardIndex)
	end)
	self:AddClickEvent(self.goBCForScrollReward, function ()
		self:ShowCard(self.showCardIndex)
	end)
end

function UISubViewControllerMonthlyVIP:GetModelSet()
	for _, v in pairs(Table_Deposit) do
		if v.Type == 2 then
			self.monthlyVIPShopItemConf = v
			break
		end
	end

	self.epVIPCards = UIModelZenyShop.Ins():GetEPVIPCards()
end

function UISubViewControllerMonthlyVIP:GetMonthCardConfigure()
	local year = UIModelMonthlyVIP.YearOfServer(-18000)
	local month = UIModelMonthlyVIP.MonthOfServer(-18000)
	for _, v in pairs(Table_MonthCard) do
		if v.Year == year and v.Month == month then
			return v
		end
	end
	return nil
end

function UISubViewControllerMonthlyVIP:LoadView()
	if self.showContentIndex == 1 or self.showContentIndex == 3 then
		self:ShowCard(self.showCardIndex)
	elseif self.showContentIndex == 2 then
		self:ShowMonthlyVIPDesp()
	elseif self.showContentIndex == 4 then
		self:ShowEPVIPReward()
	end
end

function UISubViewControllerMonthlyVIP:SetActive_Card(b)
	self.goCard:SetActive(b)
end

function UISubViewControllerMonthlyVIP:SetActive_MonthlyVIPDesp(b)
	self.goMonthlyVIPDesp:SetActive(b)
	self.goBoardM:SetActive(b)
	self.goYearAndMonth:SetActive(b)
	-- self.goValidTime:SetActive(b)
end

function UISubViewControllerMonthlyVIP:SetActive_EPVIPReward(b)
	self.goEPVIPReward:SetActive(b)
end

function UISubViewControllerMonthlyVIP:SetActive_EPBoard(b)
	self.goBoard1E:SetActive(b)
	self.goBoardE:SetActive(b)
	self.goEPNumber:SetActive(b)
end

function UISubViewControllerMonthlyVIP:SetActive_ExpirationTime(b)
	self.goExpirationTime:SetActive(b)
end

function UISubViewControllerMonthlyVIP:SetActive_Discount(b)
	self.goDiscount:SetActive(b)
	self.goOriginPrice:SetActive(b)
end

function UISubViewControllerMonthlyVIP:ShowCard(show_index)
	self:SetActive_MonthlyVIPDesp(false)
	self:SetActive_EPVIPReward(false)
	self:SetActive_Card(true)
	if show_index == 0 then
		self:SetActive_EPBoard(false)
		self:SetActive_ExpirationTime(true)
		self:ShowMonthlyVIPTime()
		local monthCardConfigure = self:GetMonthCardConfigure()
		PictureManager.Instance:SetMonthCardUI(monthCardConfigure.Picture, self.texCard)
		self.labBTNTitlePurchaseMonthlyVIP.text = self:GetPriceString(self.monthlyVIPShopItemConf.Rmb)
		self:SetActive_Discount(false)
		self.showContentIndex = 1
	else
		self:SetActive_EPBoard(true)
		self:SetActive_ExpirationTime(false)
		self:SetPurchaseBTNPos(true)
		local ep = self.epVIPCards[show_index].version
		self.labEP.text = 'EP ' .. ep
		if math.floor(ep) == ep then
			self.labEP.text = 'EP ' .. ep .. '.0'
		end
		self.epCardConf = Table_Deposit[self.epVIPCards[show_index].id1]
		PictureManager.Instance:SetEPCardUI(self.epCardConf.Picture, self.texCard)
		if self:IsDiscount() then
			self.discountEPCardConf = Table_Deposit[self.epVIPCards[show_index].id2]
			self.labBTNTitlePurchaseMonthlyVIP.text = self:GetPriceString(self.discountEPCardConf.Rmb)
			self.labOriginPrice.text = ZhString.HappyShop_originalCost .. self:GetPriceString(self.epCardConf.Rmb)
			local percent = math.ceil(self.discountEPCardConf.Rmb * 100 / self.epCardConf.Rmb)
			UIPriceDiscount.SetDiscount(percent, self.spPercentBG, self.labPercent, self.labPercentSymbol)
		else
			self.labBTNTitlePurchaseMonthlyVIP.text = self:GetPriceString(self.epCardConf.Rmb)
		end
		self.showContentIndex = 3
	end
end

function UISubViewControllerMonthlyVIP:ShowMonthlyVIPDesp(show_index)
	self:SetActive_MonthlyVIPDesp(true)
	self:SetActive_EPVIPReward(false)
	self:SetActive_Card(false)
	self:SetActive_EPBoard(false)
	if self.listControllerOfVIPDescriptions == nil then
		self.listControllerOfVIPDescriptions = UITableListCtrl.new(self.goDescriptionsRoot, 'ZenyShop', 1)
		self.listControllerOfVIPDescriptions.scrollView.onMomentumMove = function ()
			if self.listControllerOfVIPDescriptions.scrollView.verticalScrollBar.value >= 1 then
				self.goListArrow:SetActive(false)
			else
				self.goListArrow:SetActive(true)
			end
		end
		TableUtility.TableClear(gReusableTable)
		gReusableTable['cellType'] = 'VIPDescription'
		gReusableTable['cellName'] = 'UIListItemMonthlyVIPDescription'
		gReusableTable['control'] = UIListItemViewControllerVIPDescription
		self.listControllerOfVIPDescriptions:SetType(gReusableTable)
		local monthlyVIPInfosForUITableListCtrl = {}
		local dynamicVIPDescription = nil
		for _, v in pairs(GameConfig.DepositCard) do
			if v.type1 == 2 then
				dynamicVIPDescription = v.funcs
				break
			end
		end
		for k, _ in pairs(Table_DepositFunction) do
			local vipDescriptionConfID = k
			if table.ContainsValue(dynamicVIPDescription, vipDescriptionConfID) then
				local uiListItemModelVIPDescription = UIListItemModelVIPDescription.new()
				uiListItemModelVIPDescription:SetDescriptionConfigID(vipDescriptionConfID)
				table.insert(monthlyVIPInfosForUITableListCtrl, uiListItemModelVIPDescription)
			end
		end
		self.listControllerOfVIPDescriptions:UpdateInfo(monthlyVIPInfosForUITableListCtrl, false)
	end

	self.listControllerOfVIPDescriptions:ResetPosition()
	self:ShowMonthlyVIPTime()
	self.showContentIndex = 2
end

function UISubViewControllerMonthlyVIP:ShowEPVIPReward()
	self:SetActive_Card(false)
	-- self:SetActive_MonthlyVIPDesp(false)
	self:SetActive_EPVIPReward(true)
	-- self:SetActive_EPBoard(true)
	if self.listControllerOfReward == nil then
		self.uiGridOfReward = self.goRewardRoot:GetComponent(UIGrid)
		self.listControllerOfReward = UIGridListCtrl.new(self.uiGridOfReward, UIListItemViewControllerItem, 'UIListItemItem')

		self.scrollViewReward = self.goRewardList:GetComponent(UIScrollView)
	end

	local items = nil
	local useItemID = self.epCardConf.ItemId
	local team = Table_UseItem[useItemID].UseEffect.id -- team in reward.xlsx
	local items = ItemUtil.GetRewardItemIdsByTeamId(team)
	if(items)then
		self.listControllerOfReward:ResetDatas(items)
		self.itemsController = self.listControllerOfReward:GetCells()

		self.scrollViewReward:ResetPosition()
		self.showContentIndex = 4
	end
end

function UISubViewControllerMonthlyVIP:ShowMonthlyVIPTime()
	local year = UIModelMonthlyVIP.YearOfServer(-18000)
	local month = UIModelMonthlyVIP.MonthOfServer(-18000)
	self.labYear.text = tostring(year)
	if month < 10 then
		self.labMonth.text = '0' .. tostring(month)
	else
		self.labMonth.text = tostring(month)
	end
	local expirationTime = UIModelMonthlyVIP.Instance():Get_TimeOfExpirationMonthlyVIP()
	if expirationTime ~= nil then
		expirationTime = expirationTime - 18001
		local year = UIModelMonthlyVIP.YearOfUnixTimestamp(expirationTime)
		local month = UIModelMonthlyVIP.MonthOfUnixTimestamp(expirationTime)
		local day = UIModelMonthlyVIP.DayOfUnixTimestamp(expirationTime)
		-- local hour = UIModelMonthlyVIP.HourOfUnixTimestamp(expirationTime)
		-- local minute = UIModelMonthlyVIP.MinuteOfUnixTimestamp(expirationTime)
		-- local second = UIModelMonthlyVIP.SecondOfUnixTimestamp(expirationTime)
		self.labExpirationTime.text = string.format(ZhString.MouthCard_End, year, month, day)
		self:SetPurchaseBTNPos(false)
	else
		self.labExpirationTime.text = ''
	end
	-- local isLeapYear = ((math.CalculateRemainder(year, 4) == 0) and
	-- 	(math.CalculateRemainder(year, 100) ~= 0))
	-- isLeapYear = isLeapYear or (math.CalculateRemainder(year, 400) == 0)
	-- local validDays = 0
	-- if month == 2 then
	-- 	if isLeapYear then
	-- 		validDays = 29
	-- 	else
	-- 		validDays = 28
	-- 	end
	-- elseif month == 4 or month == 6 or month == 9 or month == 11 then
	-- 	validDays = 30
	-- else
	-- 	validDays = 31
	-- end
	-- self.labValidTime.text = string.format(ZhString.EndlessTower_refreshDay, validDays)
end

function UISubViewControllerMonthlyVIP:SetPurchaseBTNPos(b)
	local xValue = nil
	if b then
		xValue = 117
	else
		xValue = 135
	end
	local posOfBTN = self.goBTNPurchaseMonthlyVIP.transform.localPosition
	posOfBTN.x = xValue
	self.goBTNPurchaseMonthlyVIP.transform.localPosition = posOfBTN
end

function UISubViewControllerMonthlyVIP:OnClickForButtonPurchaseCard(show_card_index)
	local showCardIndex = show_card_index or self.showCardIndex
	helplog("OnClickForButtonPurchaseCard:", self.showCardIndex);
	if showCardIndex == 0 then
		self:RequestChargeQuery(self.monthlyVIPShopItemConf.id)
	elseif showCardIndex > 0 then
		local runtimePlatform = ApplicationInfo.GetRunPlatform()
		if runtimePlatform == RuntimePlatform.IPhonePlayer then
			if BackwardCompatibilityUtil.CompatibilityMode_V17 then
				MsgManager.ConfirmMsgByID(
					3555,
					function ()
						AppBundleConfig.JumpToIOSAppStore()
					end,
					nil
				)
				return
			end
		end
		
		self:RequestQueryChargeCnt()
		local card = self.epVIPCards[showCardIndex]
		self.queryChargeAndPurchaseID = self:GetVipCardId(card);
	end
end

function UISubViewControllerMonthlyVIP:OnClickForButtonLeftPage()
	if self.epVIPCards ~= nil then
		if self.showCardIndex <= 0 then
			self.showCardIndex = #self.epVIPCards
		else
			self.showCardIndex = self.showCardIndex - 1
		end
		self:ShowCard(self.showCardIndex)
	end
end

function UISubViewControllerMonthlyVIP:OnClickForButtonRightPage()
	if self.epVIPCards ~= nil then
		if self.showCardIndex >= #self.epVIPCards then
			self.showCardIndex = 0
		else
			self.showCardIndex = self.showCardIndex + 1
		end
		self:ShowCard(self.showCardIndex)
	end
end

function UISubViewControllerMonthlyVIP:OnClickForViewCard()
	if self.showContentIndex == 1 then
		self:ShowMonthlyVIPDesp()
	elseif self.showContentIndex == 3 then
		self:ShowEPVIPReward()
	end
end

function UISubViewControllerMonthlyVIP:ListenServerResponse()
	EventManager.Me():AddEventListener(ServiceEvent.UserEventChargeNtfUserEvent, self.OnReceivePurchaseSuccess, self)
	EventManager.Me():AddEventListener(ServiceEvent.UserEventChargeQueryCmd, self.OnReceiveChargeQuery, self)
	EventManager.Me():AddEventListener(ServiceEvent.UserEventQueryChargeCnt, self.OnReceiveQueryChargeCnt, self)
end

function UISubViewControllerMonthlyVIP:CancelListenServerResponse()
	EventManager.Me():RemoveEventListener(ServiceEvent.UserEventChargeNtfUserEvent, self.OnReceivePurchaseSuccess, self)
	EventManager.Me():RemoveEventListener(ServiceEvent.UserEventChargeQueryCmd, self.OnReceiveChargeQuery, self)
	EventManager.Me():RemoveEventListener(ServiceEvent.UserEventQueryChargeCnt, self.OnReceiveQueryChargeCnt, self)
end

function UISubViewControllerMonthlyVIP:RequestChargeQuery(shop_item_conf_id)
	ServiceUserEventProxy.Instance:CallChargeQueryCmd(shop_item_conf_id)
end

function UISubViewControllerMonthlyVIP:RequestQueryChargeCnt()
	ServiceUserEventProxy.Instance:CallQueryChargeCnt()
end

function UISubViewControllerMonthlyVIP:OnReceiveChargeQuery(data)
	if self.monthlyVIPShopItemConf ~= nil then
		if data.data_id == self.monthlyVIPShopItemConf.id then
			if data.ret then
				if PurchaseDeltaTimeLimit.Instance():IsEnd(self.monthlyVIPShopItemConf.ProductID) then
					self:Purchase()

					local interval = GameConfig.PurchaseMonthlyVIP.interval / 1000
					PurchaseDeltaTimeLimit.Instance():Start(self.monthlyVIPShopItemConf.ProductID, interval)
				else
					MsgManager.ShowMsgByID(49)
				end
			else
				local purchaseLimit = self.monthlyVIPShopItemConf.MonthLimit
				local tabFormatParams = {purchaseLimit}
				MsgManager.ShowMsgByIDTable(2645, tabFormatParams)
			end
		end
	end
end

function UISubViewControllerMonthlyVIP:OnReceivePurchaseSuccess(message)
	local messageContent = message
	local confID = messageContent.dataid
	if confID and confID > 0 then
		local conf = Table_Deposit[confID]
		if conf.Type == 2 then
			PurchaseDeltaTimeLimit.Instance():End(conf.ProductID)
		elseif conf.Type == 5 then
			PurchaseDeltaTimeLimit.Instance():End(conf.ProductID)
		end
	end
end

function UISubViewControllerMonthlyVIP:OnReceiveQueryChargeCnt(data)
	if self.queryChargeAndPurchaseID ~= nil then
		local purchaseTimes = 0
		local info = data.info
		for i = 1, #info do
			local purchaseInfo = info[i]
			local productConfID = purchaseInfo.dataid
			if productConfID == self.queryChargeAndPurchaseID then
				purchaseTimes = purchaseInfo.count
			end
		end
		local productConf = Table_Deposit[self.queryChargeAndPurchaseID]
		if purchaseTimes < productConf.MonthLimit then
			if PurchaseDeltaTimeLimit.Instance():IsEnd(productConf.ProductID) then
				self:Purchase()

				local interval = GameConfig.PurchaseMonthlyVIP.interval / 1000
				PurchaseDeltaTimeLimit.Instance():Start(productConf.ProductID, interval)
			else
				MsgManager.ShowMsgByID(49)
			end
		else
			local tabFormatParams = {productConf.MonthLimit}
			MsgManager.ShowMsgByIDTable(2645, tabFormatParams)
		end
		self.queryChargeAndPurchaseID = nil
	end
end

function UISubViewControllerMonthlyVIP:IsDiscount()
	local retValue = false
	if self.showCardIndex > 0 then
		local card = self.epVIPCards[self.showCardIndex]
		retValue = card.id2 > 0
		
		if(card.id2 == card.id1)then
			retValue = false;
		end
	end
	self:SetActive_Discount(retValue)
	return retValue
end

function UISubViewControllerMonthlyVIP:GetPriceString(price)
	return '¥ ' .. FuncZenyShop.FormatMilComma(price)
end

function UISubViewControllerMonthlyVIP:Purchase()
	local productConf = nil
	if self.showCardIndex == 0 then
		productConf = self.monthlyVIPShopItemConf
	else
		local card = self.epVIPCards[self.showCardIndex]
		local confID = self:GetVipCardId(card);
		productConf = Table_Deposit[confID]
	end
	local productID = productConf.ProductID
	if productID then
		local productName = productConf.Desc
		local productPrice = productConf.Rmb
		local productCount = 1
		local roleID = Game.Myself and (Game.Myself.data and Game.Myself.data.id or nil) or nil
		if roleID then
			local roleInfo = ServiceUserProxy.Instance:GetRoleInfoById(roleID)
			local roleName = roleInfo and roleInfo.name or ''  
			local roleGrade = MyselfProxy.Instance:RoleLevel() or 0
			local roleBalance = MyselfProxy.Instance:GetROB() or 0
			local server = FunctionLogin.Me():getCurServerData()
			local serverID = (server ~= nil) and server.serverid or nil
			if serverID then
				local currentServerTime = ServerTime.CurServerTime() / 1000
				local runtimePlatform = ApplicationInfo.GetRunPlatform()
				if runtimePlatform == RuntimePlatform.Android and not BackwardCompatibilityUtil.CompatibilityMode(BackwardCompatibilityUtil.V13) then
					TableUtility.TableClear(gReusableTable)
					gReusableTable['productGameID'] = tostring(productConf.id)
					gReusableTable['serverID'] = tostring(serverID)
					gReusableTable['payCallbackCode'] = 1
					local ext = json.encode(gReusableTable)
					FunctionXDSDK.Ins:Pay(
						productName,
						productID,
						productPrice * 100,
						serverID,
						tostring(roleID),
						"", -- order id
						ext,
						function (x)
							self:OnPaySuccess(x)
						end,
						function (x)
							self:OnPayFail(productID, x)
						end,
						function (x)
							self:OnPayCancel(productID, x)
						end
					)
				else
					if FunctionSDK.Instance.CurrentType == FunctionSDK.E_SDKType.Any then
						if not BackwardCompatibilityUtil.CompatibilityMode(BackwardCompatibilityUtil.V8) then
							FunctionSDK.Instance:ResetPayState()
						end
						TableUtility.TableClear(gReusableTable)
						gReusableTable['productGameID'] = productConf.id
						local custom = json.encode(gReusableTable)
						FunctionSDK.Instance:AnySDKPay(
							productID,
							productName,
							productPrice,
							productCount,
							tostring(roleID),
							roleName,
							roleGrade,
							roleBalance,
							tostring(serverID),
							custom,
							function (x)
								self:OnPaySuccess(x)
							end,
							function (x)
								self:OnPayFail(productID, x)
							end,
							function (x)
								self:OnPayTimeout(productID, x)
							end,
							function (x)
								self:OnPayCancel(productID, x)
							end,
							function (x)
								self:OnPayProductIllegal(productID, x)
							end,
							function (x)
								self:OnPayPaying(x)
							end
						)
					elseif FunctionSDK.Instance.CurrentType == FunctionSDK.E_SDKType.XD then
						TableUtility.TableClear(gReusableTable)
						gReusableTable['productGameID'] = tostring(productConf.id)
						gReusableTable['serverID'] = tostring(serverID)
						local ext = json.encode(gReusableTable)
						if not BackwardCompatibilityUtil.CompatibilityMode_V17 then
							local roleAndServerTime = roleID .. '_' .. currentServerTime
							self.orderIDOfXDSDKPay = MyMD5.HashString(roleAndServerTime)
							FunctionSDK.Instance:XDSDKPay(
								productPrice * 100,
								tostring(serverID),
								productID,
								productName,
								tostring(roleID),
								ext,
								productCount,
								self.orderIDOfXDSDKPay,
								function (x)
									self:OnPaySuccess(x)
								end,
								function (x)
									self:OnPayFail(productID, x)
								end,
								function (x)
									self:OnPayTimeout(productID, x)
								end,
								function (x)
									self:OnPayCancel(productID, x)
								end,
								function (x)
									self:OnPayProductIllegal(productID, x)
								end
							)
						elseif not BackwardCompatibilityUtil.CompatibilityMode(BackwardCompatibilityUtil.V6) then
							self.orderIDOfXDSDKPay = FunctionSDK.Instance:XDSDKPay(
								productPrice * 100,
								tostring(serverID),
								productID,
								productName,
								tostring(roleID),
								ext,
								productCount,
								function (x)
									self:OnPaySuccess(x)
								end,
								function (x)
									self:OnPayFail(productID, x)
								end,
								function (x)
									self:OnPayTimeout(productID, x)
								end,
								function (x)
									self:OnPayCancel(productID, x)
								end,
								function (x)
									self:OnPayProductIllegal(productID, x)
								end
							)
						else
							Debug.Log('<debug!!!>before XDSDKPay')
							FunctionSDK.Instance:XDSDKPay(
								productPrice * 100,
								tostring(serverID),
								productID,
								productName,
								tostring(roleID),
								ext,
								productCount,
								function (x)
									self:OnPaySuccess(x)
								end,
								function (x)
									self:OnPayFail(productID, x)
								end,
								function (x)
									self:OnPayTimeout(productID, x)
								end,
								function (x)
									self:OnPayCancel(productID, x)
								end,
								function (x)
									self:OnPayProductIllegal(productID, x)
								end
							)
						end
					end
				end
			end
		end
	end
end

function UISubViewControllerMonthlyVIP:OnPaySuccess(str_result)
	local str_result = x or 'nil'
	LogUtility.Info('UIViewControllerZenyShop:OnPaySuccess, ' .. str_result)

	if not BackwardCompatibilityUtil.CompatibilityMode(BackwardCompatibilityUtil.V6) then
		local runtimePlatform = ApplicationInfo.GetRunPlatform()
		if runtimePlatform == RuntimePlatform.IPhonePlayer then
			if self.orderIDOfXDSDKPay ~= nil then
				FunctionADBuiltInTyrantdb.Instance():ChargeTo3rd(self.orderIDOfXDSDKPay, self.monthlyVIPShopItemConf.Rmb)
			end
		elseif runtimePlatform == RuntimePlatform.Android then
			if not BackwardCompatibilityUtil.CompatibilityMode(BackwardCompatibilityUtil.V13) then
				-- "" is orderID
				FunctionADBuiltInTyrantdb.Instance():ChargeTo3rd("", self.monthlyVIPShopItemConf.Rmb)
			else
				local orderID = FunctionSDK.Instance:GetOrderID()
				FunctionADBuiltInTyrantdb.Instance():ChargeTo3rd(orderID, self.monthlyVIPShopItemConf.Rmb)
			end
		end
	end
end

function UISubViewControllerMonthlyVIP:OnPayFail(product_id, str_result)
	local strResult = str_result or 'nil'
	LogUtility.Info('UIViewControllerZenyShop:OnPayFail, ' .. strResult)

	PurchaseDeltaTimeLimit.Instance():End(product_id)
end

function UISubViewControllerMonthlyVIP:OnPayTimeout(product_id, str_result)
	local strResult = str_result or 'nil'
	LogUtility.Info('UIViewControllerZenyShop:OnPayTimeout, ' .. strResult)

	PurchaseDeltaTimeLimit.Instance():End(product_id)
end

function UISubViewControllerMonthlyVIP:OnPayCancel(product_id, str_result)
	local strResult = str_result or 'nil'
	LogUtility.Info('UIViewControllerZenyShop:OnPayCancel, ' .. strResult)

	PurchaseDeltaTimeLimit.Instance():End(product_id)
end

function UISubViewControllerMonthlyVIP:OnPayProductIllegal(product_id, str_result)
	local strResult = str_result or 'nil'
	LogUtility.Info('UIViewControllerZenyShop:OnPayProductIllegal, ' .. strResult)

	PurchaseDeltaTimeLimit.Instance():End(product_id)
end

function UISubViewControllerMonthlyVIP:OnPayPaying(str_result)
	local strResult = str_result or 'nil'
	LogUtility.Info('UIViewControllerZenyShop:OnPayPaying, ' .. strResult)
end