local BillboardExcel = require("excel.billboard")
local UnionExcel = require("excel.union")
local Msg = require("core.Msg")
local BillboardDefine = require("billboard.BillboardDefine")
local BillboardDB = require("billboard.BillboardDB")
local BRoleLogic = require("billboard.BRoleLogic")
local BillboardAim = require("billboard.BillboardAim")
local BattleLogic = require("battle.BattleLogic")
local RoleLogic = require("role.RoleLogic")
local UnionDBLogic = require("union.UnionDBLogic")
local CombatDefine = require("combat.CombatDefine")
local UnionExcel = require("excel.union")

function fontBoardUnionNet(net, union)
    local lv = math.min(union.lv, #UnionExcel.union)
    local config = UnionExcel.union[lv]

	net.unionUuid = union._id 
	net.name = union.name 
	net.lv = union.lv 
    net.maxCnt = config.maxCnt
    net.curCnt = union.curCnt
	net.zhandouli = union.zhandouli
	net.bannerID = union.bannerID
end

local function fontValuesShow(human, net, boardType, rankData)
	if boardType == BillboardDefine.TYPE_BATTLE then
		local battleID = rankData and rankData.value1 or 0
		local battleName, mapName = BattleLogic.getBattleName(human, battleID)
		net.value1 = mapName .. battleName
		net.value2 = tostring(rankData and rankData.value2 or "")
	else
		net.value1 = tostring(rankData and rankData.value1 or "")
		net.value2 = tostring(rankData and rankData.value2 or "")
	end
end

local function getBoardUuidByType(boardType, human)
	if boardType == BillboardDefine.TYPE_UNION then
		return human.db.unionUuid
	else
		return human.db._id
	end
end

local function getZhanliTypeByType(boardType)
	if boardType == BillboardDefine.TYPE_LIANYU then
		return CombatDefine.COMBAT_TYPE1
	end
end

function fontBoardNet(human, net, boardType, rank, rankData, uuid)
	net.rank = rank or 0	
	net.unionData[0] = 0	
	if boardType == BillboardDefine.TYPE_UNION then
		local union = UnionDBLogic.getUnion(rankData.uuid)
		local presidentUuid = uuid
		if union then
			net.unionData[0] = 1
			fontBoardUnionNet(net.unionData[1], union)
			presidentUuid = union.presidentUuid
		end
		RoleLogic.getRoleBaseByUuid(presidentUuid, net.roleBase)
	else
		if rankData and rankData.roleBase then
			RoleLogic.makeRoleBase(rankData.roleBase, net.roleBase)
		else
			local roleUuid = rankData and rankData.uuid or uuid
			RoleLogic.getRoleBaseByUuid(roleUuid, net.roleBase, getZhanliTypeByType(boardType))
		end
	end
	fontValuesShow(human, net, boardType, rankData)
end

-- 封装总览结构体
function fontMainNet(net, boardType, config, human)
	net.boardType = boardType
	net.boardName = config.boardName
	net.topData[0] = 0
	local rank = 1
	local rankData = BillboardDB.getRankData(boardType, rank)
	if rankData then
		net.topData[0] = 1
		fontBoardNet(human, net.topData[1], boardType, rank, rankData)
	end
	net.hasAim = BillboardAim.getAimIDsByType(boardType) and 1 or 0
	net.hasAimRed = BillboardAim.isAimRed(human, boardType) and 1 or 0
end

-- 发送排行榜总览列表
function sendMainList(human)
	local msgRet = Msg.gc.GC_BILLBOARD_MAINLIST
	msgRet.list[0] = 0
	for boardType, config in ipairs(BillboardExcel.board) do
		if config.isShow == 1 then
			msgRet.list[0] = msgRet.list[0] + 1
			local net = msgRet.list[msgRet.list[0]]
			fontMainNet(net, boardType, config, human)
		end
	end
	--Msg.trace(msgRet)
	Msg.send(msgRet, human.fd)
end

-- 发送排行榜
function sendQuery(human, boardType)
	local board = BillboardDB.getBoard(boardType)
	if not board then return end

	local msgRet = Msg.gc.GC_BILLBOARD_QUERY
	msgRet.boardType = boardType
	msgRet.list[0] = math.min(#msgRet.list, #board.rank2data)
	for i = 1, msgRet.list[0] do
		local rankData = board.rank2data[i]
		fontBoardNet(human, msgRet.list[i], boardType, i, rankData)
	end

	local boardUuid = getBoardUuidByType(boardType, human)
	local myRank = BillboardDB.getRank(boardType, boardUuid)

	local myRankData = myRank and board.rank2data[myRank]
	if myRankData == nil then
		local value1, value2 = BRoleLogic.getValues(boardType, human.db)
		if value1 then
			myRankData = BRoleLogic.getCacheData(boardType, human.db, value1, value2)
		end
	end
	fontBoardNet(human, msgRet.ownData, boardType, myRank, myRankData, human.db._id)
	--Msg.trace(msgRet)
	Msg.send(msgRet, human.fd)
end


-- 清掉 每日重置的排行榜 
function onZero()
	for type in pairs(BillboardDefine.DAY_RESET) do 
		BillboardDB.initBoard(type)
	end
end

function isDot(human)
	for boardType, config in ipairs(BillboardExcel.board) do
		if config.isShow == 1 then
			if BillboardAim.isAimRed(human, boardType) then
               return true
            end
		end
	end
    return false
end


function GetRankList(boardType)
	local board = BillboardDB.getBoard(boardType)
	return board and board.rank2data
end