------------------------------------------------
--作者: yangqf
--日期: 2021-04-09
--文件: GuideSystem.lua
--模块: GuideSystem
--描述: 引导系统
------------------------------------------------
local L_GuideKey = "GuideFinishKey_%d"

local GuideSystem = {
    GuideTable = nil,
    FinishList = nil,
}

function GuideSystem:Initialize()
end

function GuideSystem:UnInitialize()
    self.GuideTable = nil
    self.FinishList = nil
end


function GuideSystem:Check(type, param)
    if type == GuideTriggerType.None then
        return false
    end
    local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
    if _lp == nil then
        return false
    end

    if self.FinishList == nil then
        self.FinishList = List:New()
        local _finishText = PlayerPrefs.GetString(string.format(L_GuideKey, _lp.ID), nil)
        if _finishText ~= nil and string.len(_finishText) > 0 then
            local _paramsArray = Utils.SplitNumber(_finishText, '_')
            for i = 1, #_paramsArray do
                self.FinishList:Add(_paramsArray[i])
            end
        end
    end
    if self.GuideTable == nil then
        self.GuideTable = Dictionary:New()
        local _func = function(k, cfg)
            if not self.FinishList:Contains(k) then
                local _list = self.GuideTable[cfg.TriggerType]
                if _list == nil then
                    _list = List:New()
                    self.GuideTable:Add(cfg.TriggerType,  _list)
                end
                _list:Add(cfg)
            end
        end
        DataConfig.DataGuide:Foreach(_func)
    end

    local _waitCheckList = self.GuideTable[type]
    if _waitCheckList == nil then
        return false
    end

    if #_waitCheckList <= 0 then
        self.GuideTable:Remove(type)
        return false
    end

    local _lpLevel = _lp.Level
    for i = #_waitCheckList, 1, -1 do
        local _guideItem = _waitCheckList[i]
        if (_guideItem.TriggerParam == param and
            (_guideItem.LimitLevelMin <= 0 or _lpLevel >= _guideItem.LimitLevelMin) and
            (_guideItem.LimitLevelMax <= 0 or _lpLevel <= _guideItem.LimitLevelMax)) then
            GameCenter.BlockingUpPromptSystem:AddForceGuide(_guideItem)
            if _guideItem.Type == GuideForcedType.NotForced or _guideItem.Type == GuideForcedType.SceneAnim or _guideItem.Type == GuideForcedType.TimelineAnim then
                --非强制引导直接设置为已经引导
                self:SaveGuide(_guideItem.Id)
            end
            return true
        end
    end
    return false
end

function GuideSystem:SaveGuide(guideID)
    local _lp = GameCenter.GameSceneSystem:GetLocalPlayer()
    if _lp == nil or self.FinishList==nil then
        return
    end
    if not self.FinishList:Contains(guideID) then
        self.FinishList:Add(guideID)
        local _text = ""
        for i = 1, #self.FinishList do
            _text = _text .. self.FinishList[i]
            if i < #self.FinishList then
                _text = _text .. "_"
            end
        end
        PlayerPrefs.SetString(string.format(L_GuideKey, _lp.ID), _text)
        PlayerPrefs.Save()
    end

    for k, v in pairs(self.GuideTable) do
        for i = #v, 1, -1  do
            if v[i].Id == guideID then
                v:RemoveAt(i)
            end
        end
    end
end

return GuideSystem