----------------------------------------------------------
-- 道具使用
----------------------------------------------------------

local Lang = require("common.Lang")
local Msg = require("core.Msg")
local ObjHuman = require("core.ObjHuman")
local Grid = require("bag.Grid")
local ItemDefine = require("bag.ItemDefine")
local BagLogic = require("bag.BagLogic")
local BoxLogic = require("bag.BoxLogic")
local Broadcast = require("broadcast.Broadcast")
local FundLogic = require("present.FundLogic")
local SuperFundLogic = require("present.SuperFundLogic")
local TopupLogic = require("topup.TopupLogic")
local VipLogic = require("vip.VipLogic")
local RoleHeadLogic = require("role.RoleHeadLogic")
local BarTaskLogic = require("bar.BarTaskLogic")
local YjTreasureLogic = require("yjTreasure.YjTreasureLogic")
local ItemComonBuyExcel = require("excel.item").commonBuy
local UnionLogic = require("union.UnionLogic")
local RoleDBLogic = require("role.RoleDBLogic")
local EquipLogic = require("equip.EquipLogic")
local FuwenGrid = require("fuwen.FuwenGrid")
local Util = require("common.Util")
local XingYaoGongMing = require("xingYaoMen.XingYaoGongMing")
local DropExchangeLogic = require("absAct.DropExchangeLogic")
local HeroGrowUp = require("absAct.HeroGrowUp")
local BuyExcel = require("excel.buy")
local LostTempleLogic = require("lostTemple.lostTempleLogic")
local BattleLogic = require("battle.BattleLogic")
local HeroSkinLogic = require("present.HeroSkinLogic")
local TreasureChestLogic = require("treasurechest.TreasureChestLogic")
local CommerceMiddle = require("serverCommerce.ServerCommerceManager")

cmd 		= {}

FUWEN_BAG_TYPE = 1
NORMAL_BAG_TYPE = 2
EQUIP_BAG_TYPE = 3

-- 所使用道具的相关信息
local function createData(id, cnt, itemConfig, logType, isAuto)
	local data = {}
	data.id = id  					-- 道具id
	data.cnt = cnt 					-- 使用道具数量
	data.left = cnt 				-- 剩余要使用的数量
	data.config = itemConfig 		-- 道具配置
	data.logType = logType 			-- 日志类型
	data.isAuto = isAuto 			-- 是否自动使用
	return data
end

-- 金币
function cmd.jinbi(data, human, value)
	if data.left < 1 then return end
	local sumJinbi = value * data.left
	data.left = 0
	ObjHuman.updateJinbi(human, sumJinbi, data.logType)	
end

-- 钻石
function cmd.zuanshi(data, human, value)
	if data.left < 1 then return end
	local sumZuanshi = value * data.left
	data.left = 0		
	ObjHuman.addZuanshi(human, sumZuanshi, data.logType)
end


-- 经验
function cmd.exp(data, human, value)
	if data.left < 1 then return end
	local sumExp = value * data.left
	data.left = 0
	ObjHuman.addExp(human, sumExp)
end

-- 自选宝箱
function cmd.box(data, human, list)
	BoxLogic.sendBoxList(human, list)	
end

-- 随机宝箱
function cmd.boxRand(data, human, list)
	if data.left < 1 then return end	

	local itemLen = list and #list or 0
    if itemLen < 1 then
		return Broadcast.sendErr(human, Lang.ITEM_USE_ERR_CONFIG)
	end	

	local weightSum = 0
	for i = 1, itemLen do
		local weight = list[i][3]
		weightSum = weightSum + weight
	end
	if weightSum < 1 then
		return Broadcast.sendErr(human, Lang.ITEM_USE_ERR_CONFIG)
	end

    -- 检测数量
    local equipCnt = 0
    local fuWenCnt = 0
	BagLogic.cleanMomentItemList()
    local mathRandom = math.random
	for i = 1, data.left do
		local r = mathRandom(1, weightSum)
		for j = 1, itemLen do
			local itemID = list[j][1]
			local itemCnt = list[j][2]
			local weight = list[j][3]
            local quality = list[j][4]
			if r <= weight then
				BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, itemID, itemCnt, quality)
                -- 计算装备数量
                if ItemDefine.isEquip(itemID) then
                   equipCnt = equipCnt + itemCnt
                end
                
                if ItemDefine.isFuwen(itemID) then
                   fuWenCnt = fuWenCnt + itemCnt
                end
				break
			end
			r = r - weight
		end		
	end

    -- 检测装备背包空间
    if not EquipLogic.checkEmptyCnt(human, equipCnt) then
       BagLogic.cleanMomentItemList()
       return
    end

    if not FuwenGrid.checkEmptyCnt(human, fuWenCnt) then
       BagLogic.cleanMomentItemList()
       return
    end

	data.left = 0
	BagLogic.addMomentItemList(human, "useBox", true)
end

-- 固定箱子
function cmd.boxAll(data, human, list)
	if data.left < 1 then return end	

	local cnt = data.left
    local oustList = {}
    local len = 0
    local equipCnt = 0
    local fuWenCnt = 0
	for i = 1, #list do
		local itemID = list[i][1]
		local itemCnt = list[i][2] * cnt
        local quality = list[i][3]
        
        oustList[i] = {}
        oustList[i][1] = itemID
        oustList[i][2] = itemCnt
        oustList[i][3] = quality
        
        -- 计算装备数量
        if ItemDefine.isEquip(itemID) then
           equipCnt = equipCnt + itemCnt
        end

        if ItemDefine.isFuwen(itemID) then
           fuWenCnt = fuWenCnt + itemCnt
        end
	end

    -- 检测装备背包空间
    if not EquipLogic.checkEmptyCnt(human, equipCnt) then
       return
    end

    if not FuwenGrid.checkEmptyCnt(human, fuWenCnt) then
       return
    end

    data.left = 0
    BagLogic.addItemList(human, oustList, "useBox")
end

-- 获得称号
function cmd.chenghao(data, human)
	RoleHeadLogic.active(human, RoleHeadLogic.HEAD_TYPE_4, data.config.icon)
	return true
end

-- 头像
function cmd.head(data, human)
	RoleHeadLogic.active(human, RoleHeadLogic.HEAD_TYPE_1, data.config.icon)
	return true
end

-- 头像框
function cmd.headFrame(data, human)
    RoleHeadLogic.active(human, RoleHeadLogic.HEAD_TYPE_2, data.config.icon)
	return true
end

-- 小基金/大基金
function cmd.superfund(data, human, ftype)
	SuperFundLogic.buySuperFund(human, ftype)
	return true
end

-- 钻石基金
function cmd.fundbuy(data, human, ftype)
    FundLogic.fundBuy(human, ftype)
	return true
end

-- 扫荡特权 
function cmd.tequanmopup(data, human, day)
	local time = os.time()
	if human.db.tequanMopup and human.db.tequanMopup > time then
		time = human.db.tequanMopup
	end
	human.db.tequanMopup = time + day * 86400
	return true
end

-- 民生/悬赏高级特权 
function cmd.tequanbar1(data, human)
	BarTaskLogic.activateBarVip(human, 1)
	return true
end

-- 民生/悬赏豪华特权
function cmd.tequanbar2(data, human)
	BarTaskLogic.activateBarVip(human, 2)
	return true
end

-- 模拟充值
function cmd.chargemoney(data, human, value, noAddYb)
	if data.left < 1 then return end
	local price = value * data.left
	data.left = 0
	TopupLogic.clacTopupAcount(human, price)
    if noAddYb ~= 1 then
    	VipLogic.addExp(human, price*10)
    	ObjHuman.addZuanshi(human, price*10, data.logType)
    end
end

-- 大月卡
function cmd.fundbig(data, human)
	
	return true
end

-- 小月卡
function cmd.fundsmall(data, human)
	
	return true
end

-- 友情值
function cmd.friendheart(data, human, value)
	if data.left < 1 then return end
	local sum = data.left * value
	data.left = 0
	ObjHuman.updateFriendHeart(human, sum, data.logType)
end

-- vip经验
function cmd.vipexp(data, human, value)
	if data.left < 1 then return end
	local sum = data.left * value
	data.left = 0
	VipLogic.addExp(human, sum)
end

--民生任务 情报值
function cmd.qingbao(data, human, value)
	if data.left < 1 then return end
	local sum = value * data.left
	data.left = 0

	BarTaskLogic.addBarQingBao(human,sum)
end

--遗迹探宝
function cmd.yjtreasureYJ(data, human, yaojiType)
	YjTreasureLogic.yjYaoJiAdd(human,data.left,yaojiType)
end

--遗迹探宝
function cmd.heroGrowUp(data, human)
	HeroGrowUp.addJifen(human, data.cnt)
end

function cmd.guildexp(data, human, value)
	if data.left < 1 then return end
	local sum = value * data.left
	data.left = 0
	UnionLogic.addUnionExpByItem(human, sum)
end

function cmd.absDrop(data, human, value)
	if data.left < 1 then return end
	local sum = data.left * value
	data.left = 0
	DropExchangeLogic.addJifen(human, sum)
end

function cmd.zhigou(data, human, value)
    if data.left < 1 then return end
    local buyConf = BuyExcel.buy[value]
    if not buyConf then
        return
    end

    local msg = {}
    msg.logintype = 2
    msg.openid = "oCD-L5RxAtfRe8-aiezdY-Ccla5U"
    msg.openkey = "VsBJf2DKah7QhzU5xuzLNA=="
    msg.yuanbao = buyConf.CN * 10
    msg.buyID = value
    msg.account = human.db.account
    msg.transaction_id = "transaction_id1"
    msg.pf = "android"
    msg.money = buyConf.CN

    require("platform.ApiLogic").CHARGE_CODE_HIS = {}
    require("AdminLogic").adminFunction.tencentPay(msg)
end

function cmd.lostRevice(data, human, value)
   if data.left < 1 then return end

   LostTempleLogic.lostTempleRevice(human)

   return true
end

function cmd.mergeHero(data, human, value)
    if data.left < 1 then return end
    return true
 end

 function cmd.hatchMerge(data, human, value)
    if data.left < 1 then return end
    return true
    -- human.db.mergeInfo = human.db.mergeInfo or {}
    -- human.db.mergeInfo.endTime =  human.db.mergeInfo.endTime or 0

    -- if  human.db.mergeInfo.endTime > 0 then
    --     local itemSpeedTime = (60 * 5 * data.cnt)
    --     local hatchTime = human.db.mergeInfo.endTime - itemSpeedTime - os.time()
    --     if hatchTime <= 0 then
    --         human.db.mergeInfo.endTime = 0
    --         return true 
    --     else
    --         human.db.mergeInfo.endTime = human.db.mergeInfo.endTime - itemSpeedTime
    --         return true 
    --     end
    -- end

    -- return false
 end

 -- 使用增加主线关卡扫荡次数道具
 function cmd.AddFreeMopup(data, human)
    if 0 >= data.left then
        return false
    end

    BattleLogic.BattleLogic_AddMopup(human, data.id, data.cnt)

    -- 把剩余数量改成0，才能消耗
    data.left = 0
 end

-- 使用皮肤道具
function cmd.UseSkinItem(data, human, nMoney)
    if 0 >= data.left then
        return false
    end

    HeroSkinLogic.SendSkinInfoByMoney(human, nMoney, data.id)
end

function cmd.treasurechestadd(data, human)
    if 0 >= data.left then
        return
    end

    TreasureChestLogic.TreasureChestLogic_AddItem(human, data.id, data.cnt)
end

function cmd.UseYanHua(data,human)
    if 0>=data.cnt then
        return
    end
    TopupLogic.Addtime(human,data.cnt)
    data.left = 0
end

function cmd.AddServerCommerPoint(data, human)
    if 0 >= data.left then
        return
    end

    CommerceMiddle.CommerceMiddle_AddTaskPoint(human, data.cnt)
end
-----------------------------------------------------------------------------

-- 仅使用道具，不扣道具
function onlyuse(human, id, cnt, logType, isAuto)
	if cnt < 1 then return end

	local itemConfig = ItemDefine.getConfig(id)
	if not itemConfig or not itemConfig.cmd then
		return Broadcast.sendErr(human, Lang.ITEM_USE_ERR_CANT_USE)
	end

	local command = itemConfig.cmd
	local cmdName = command[1]
	if not cmdName or not cmd[cmdName] then
		return Broadcast.sendErr(human, Lang.ITEM_USE_ERR_CANT_USE)
	end

	local data = createData(id, cnt, itemConfig, logType, isAuto)
	while 0 < data.left do
		local isok = cmd[cmdName](data, human, command[2], command[3], command[4])
		if isok then
			data.left = data.left - 1
		else
			break
		end
	end
	return true, data.left
end

-- 使用并扣道具
function use(human, id, cnt)
	if cnt < 1 then return end
	if id < 1 then return end

	local bagCnt = BagLogic.getItemCnt(human, id, true)
	if bagCnt < cnt then
		return Broadcast.sendErr(human, Lang.ITEM_USE_ERR_NO)
	end

	local success, left = onlyuse(human, id, cnt, "item_use")
	if not success then
		return
	end

	local delCnt = cnt - left
	if delCnt > 0 then
		BagLogic.delItem(human, id, delCnt, "item_use")
	end
end

-- 
function sendItemUse(human, id)
	local msgRet = Msg.gc.GC_ITEM_USE
	msgRet.id = id
	Msg.send(msgRet, human.fd)
end

-- 根据id获取item
function sendItemDateByID(human,type,index,id,uuid)
    local msgRet = Msg.gc.GC_ITEM_GET_BY_ID
    if type == FUWEN_BAG_TYPE then
        -- 取出背包
        local bagFileds = {fuwenBag = 1}
        local db = nil
        
        -- 玩家在线直接取缓存
        local tempHuman = ObjHuman.onlineUuid[uuid]
        if tempHuman == nil then
            db = RoleDBLogic.getDb(uuid,bagFileds)
        else
            db = tempHuman.db
        end

        -- 玩家不存在，返回
        if db == nil then
            return
        end

        local fuwenGrid = db.fuwenBag[index]
        -- 符文背包id对不上，返回
        if fuwenGrid == nil or fuwenGrid.id ~= id then
            return
        end
        Grid.makeItem(msgRet.item,id,1,nil,fuwenGrid,index,0)
    elseif type == NORMAL_BAG_TYPE then
        Grid.makeItem(msgRet.item,id,1)
    elseif type == EQUIP_BAG_TYPE then
        -- 取出背包
        local bagFileds = {equipBag = 1}
        local db = nil
        
        -- 玩家在线直接取缓存
        local tempHuman = ObjHuman.onlineUuid[uuid]
        if tempHuman == nil then
            db = RoleDBLogic.getDb(uuid,bagFileds)
        else
            db = tempHuman.db
        end

        -- 玩家不存在，返回
        if db == nil then
            return
        end

        local equipGrid = db.equipBag[index]
        -- 符文背包id对不上，返回
        if equipGrid == nil or equipGrid.id ~= id then
            return
        end
        Grid.makeItem(msgRet.item,id,1,nil,equipGrid,index,0)
    end

    Msg.send(msgRet,human.fd)
end


-- 根据id获取item
function sendItemData(human,itemID)
    local msgRet = Msg.gc.GC_ITEM_GET_BY_ITEM_ID
    local itemCnt = BagLogic.getItemCnt(human,itemID)
    Grid.makeItem(msgRet.item,itemID,itemCnt)
    Msg.send(msgRet,human.fd)
end

function itemBuyQuery(human,itemID)
    local config = ItemComonBuyExcel[itemID]
    if config == nil then
        return
    end
    local msgRet = Msg.gc.GC_ITEM_BUY_QUERY
    Grid.makeItem(msgRet.need,config.price[1],config.price[2])
    Grid.makeItem(msgRet.get,itemID,config.cnt)
    Msg.send(msgRet,human.fd)
end

function itemBuyDo(human,itemID,itemCnt)
    local msgRet = Msg.gc.GC_ITEM_BUY_DO
    msgRet.ret = 0
    local config = ItemComonBuyExcel[itemID]
    if config == nil then
        Msg.send(msgRet,human.fd)
        return
    end

    local needID = config.price[1]
    local needCnt = config.price[2] * itemCnt

    local costCnt = BagLogic.getItemCnt(human,needID)
    if costCnt < needCnt then
        Msg.send(msgRet,human.fd)
        return
    end

	BagLogic.delItem(human, needID, needCnt, "buy_item")
	BagLogic.cleanMomentItemList()
	BagLogic.updateMomentItem(1, itemID, itemCnt*config.cnt)
	BagLogic.addMomentItemList(human, "buy_item")
    msgRet.ret = 1
    Msg.send(msgRet,human.fd)
end

