-----------------------------------------------
-- 跨服操作项

-- human.db.middleOptions	跨服操作列表
-- addItem 					添加道具
-- updateYuanbao 			刷新水晶
-- updateYinliang 			刷新银两
------------------------------------------------

local Log = require("common.Log")
local Lang = require("common.Lang")
local ObjHuman = require("core.ObjHuman")
local BagLogic = require("bag.BagLogic")
local MailLogic = require("mail.MailLogic")

-- 操作类型枚举
OPTYPE_ADD_ITEM = 1 		-- 背包添加道具
OPTYPE_UPDATE_YUANBAO = 2 	-- 添加/扣水晶
OPTYPE_UPDATE_YINLIANG = 3 	-- 添加/扣金币

-- 操作白名单，预防用
LOGTYPE_WHITE_LIST = {
	["minewar"] = true, -- reyes todo 这里要改成战火大陆的logtype
}

cmd = cmd or {}

local function getOptionsByType(human, optype)
	human.db.middleOptions = human.db.middleOptions or {}
	human.db.middleOptions[optype] = human.db.middleOptions[optype] or {}
	return human.db.middleOptions[optype]
end

local function checkLogType(logType, optype)
	if LOGTYPE_WHITE_LIST[logType] then
		return true
	end	
	Log.write(Log.LOGID_TEST, "not in white list", logType, optype)
end

function getItemCntByID(human, itemID, logType)
	if not _G.is_middle then return end
	if not checkLogType(logType, OPTYPE_ADD_ITEM) then return end
	local options = getOptionsByType(human, OPTYPE_ADD_ITEM)
	if options[itemID] == nil then return end
	return options[itemID][logType]
end

-- 跨服添加道具
function addItem(human, itemID, itemCnt, logType)
	if not _G.is_middle then return end
	if not checkLogType(logType, OPTYPE_ADD_ITEM) then return end
	local options = getOptionsByType(human, OPTYPE_ADD_ITEM)
	options[itemID] = options[itemID] or {}
	options[itemID][logType] = (options[itemID][logType] or 0) + itemCnt
end

cmd[OPTYPE_ADD_ITEM] = function(human, options)
	local failList = nil
	for itemID, option in pairs(options) do
		for logType, itemCnt in pairs(option) do
			if not BagLogic.addItem(human, itemID, itemCnt, nil, logType) then
				if logType == "minewar" then
					failList = failList or {}
					failList[#failList + 1] = {itemID, itemCnt}
				end
			end
		end
	end
	if failList then
		MailLogic.addMail(human,Lang.MINEWAR_MAIL_TITLE2,Lang.MINEWAR_MAIL_CONTENT2,failList)
	end
end


-- 跨服更新水晶
function updateYuanbao(human, value, logType)
	if not _G.is_middle then return end	
	if not checkLogType(logType, OPTYPE_UPDATE_YUANBAO) then return end
	local options = getOptionsByType(human, OPTYPE_UPDATE_YUANBAO)
	options[logType] = (options[logType] or 0) + value
end

cmd[OPTYPE_UPDATE_YUANBAO] = function(human, options)
	for logType, value in pairs(options) do
		if value > 0 then
			ObjHuman.addYuanbao(human, value, logType) 
		elseif value < 0 then
			ObjHuman.decYuanbao(human, "yuanbao", value, logType) 
		end
	end
end

-- 跨服更新金币
function updateYinliang(human, value, logType)
	if not _G.is_middle then return end	
	if not checkLogType(logType, OPTYPE_UPDATE_YINLIANG) then return end
	local options = getOptionsByType(human, OPTYPE_UPDATE_YINLIANG)
	options[logType] = (options[logType] or 0) + value	
end

cmd[OPTYPE_UPDATE_YINLIANG] = function(human, options)
	for logType, value in pairs(options) do
		if value ~= 0 then
			ObjHuman.updateYinliang(human, value, logType)
		end
	end
end

-- 回到本服需要处理跨服操作事件
function handleOptions(human, middleOptions)
	if _G.is_middle then return end	
	if not middleOptions then return end
	for optype, options in pairs(middleOptions) do
		if cmd[optype] then
			cmd[optype](human, options)
		end
	end
end


	