-- This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
-- To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/
-- or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.

local MereHealingFrames, privateVars = ...

MereHealingFrames.BuffSets = {}
MereHealingFrames.BuffSets.Sets = {}

MereHealingFrames.BuffSets.CurrentSet = nil

local BuffSets = MereHealingFrames.BuffSets

local function FindBuffSetForRole(soulSpec)
    local currentBuffSet = nil
    local currentBuffSetName = nil
    for setName, buffSet in pairs(BuffSets.Sets) do
        if not buffSet.SoulSpecs or buffSet.SoulSpecs[soulSpec] then
            currentBuffSet = buffSet
            currentBuffSetName = setName
            break
        end
    end
    return currentBuffSet, currentBuffSetName
end

function BuffSets.UpdateCurrentSet()
	local currentSoulSpec = Inspect.TEMPORARY.Role()

	if currentSoulSpec == nil then
		currentSoulSpec = 1
	end

	MereHealingFrames.Debug(1, "Using Soul %d", currentSoulSpec)

	local currentBuffSet, currentBuffSetName = FindBuffSetForRole(currentSoulSpec)

	if not currentBuffSet then
		print("Unable to find a valid Buff Set for this soul, please configure a buff set for the current role (Note this maybe a glitch while transitioning to larger number of roles)")

        if (MereHealingFrames.BuffSets.CurrentSet) then
            print ("Keeping the current buff set.")
            return
        else
            print ("Attempting to use buff set for role 1.")
            currentBuffSet, currentBuffSetName = FindBuffSetForRole(1)
            if not currentBuffSet then
                print ("Unable to locate buffset for role 1, something is wrong with your saved variables or buff configuration.  Creating empty buffset.")
                BuffSets.CreateVeryEmptySet()
                currentBuffSet, currentBuffSetName = FindBuffSetForRole(1)
                if not currentBuffSet then
                    error("Unable to find buffset for role 1, or able to create an empty replacement")
                end
            end
            print ("Using buff set for role 1.")
        end
	end

	if BuffSets.CurrentSet ~= currentBuffSet then
		MereHealingFrames.Debug(1, "Using BuffSet %s", currentBuffSetName)
		BuffSets.CurrentSet = currentBuffSet
		BuffSets.UpdateCurrentBuffs()
	else
		MereHealingFrames.Debug(1, "Buff Set unchanged, still using %s", currentBuffSetName)
	end
end

function BuffSets.Save()
	return BuffSets.Sets
end

function BuffSets.Load(SavedVars)
	if SavedVars == nil then
		BuffSets.CreateEmptyBuffs()
	else
		BuffSets.Sets = SavedVars
	end
	BuffSets.UpdateCurrentSet()
end

function BuffSets.CreateEmptyTracker()
	return {
		buffType = "priority",
		buffCaster = "self",
		buffSlots = {}
		}
end

function BuffSets.CreateVeryEmptySet()
    BuffSets.Sets = {
        EmptyBuffSet = {
            Trackers = {
            },
            SoulSpecs = MereHealingFrames.Spells.createDefaultSoulSpec()
        }
    }
end

function BuffSets.CreateEmptyBuffs()
	BuffSets.Sets = {
		SampleSet = {
			Trackers = {
				hots = {
					buffType = "priority",
					buffList = "Healing Spray, Latent Blaze",
					debuffsOverBuffs = false,
					buffCaster = "self",
					buffSlots = {
						true
						}
					},
				shield = {
					buffType = "priority",
					buffList = "Ward of the Ancestors",
					debuffList = "Ancestral Slumber",
					debuffsOverBuffs = true,
					buffCaster = "self",
					buffSlots = {
						false,true
						}
					},
				blaze = {
					buffType = "priority",
					buffList = "Latent Blaze",
					debuffList = "Latent Blaze",
					debuffsOverBuffs = true,
					buffCaster = "self",
					buffSlots = {
						false,false, true
						}
					},
				Blessing = {
					buffType = "priority",
					buffList = "Fiery Blessing",
					debuffList = nil,
					debuffsOverBuffs = true,
					buffCaster = "self",
					buffSlots = {
						false,false,false, true
						}
					},
			},
			SoulSpecs = MereHealingFrames.Spells.createDefaultSoulSpec()
		}
	}
end



function BuffSets.ClearSoulSpec(soulSpec)
	for setName, set in pairs(BuffSets.Sets) do
		if not set.SoulSpecs then
			set.SoulSpecs = MereHealingFrames.Spells.createDefaultSoulSpec()
		end
		set.SoulSpecs[soulSpec] = false
	end
end

function BuffSets.ClearBuffSlot(currentBuffSet, buffSlot)
	local trackers = currentBuffSet.Trackers
	for trackerName, tracker in pairs(trackers) do
		if not tracker.buffSlots then
			tracker.buffSlots = {}
		end
		tracker.buffSlots[buffSlot] = false
	end
end

function BuffSets.CreateNewBuffSet(newSetName)
	if BuffSets.Sets[newSetName] then
		return false
	end

	local newBuffSet = {
		Trackers = {},
		SoulSpecs = MereHealingFrames.Spells.createDefaultSoulSpec(false)
	}
	BuffSets.Sets[newSetName] = newBuffSet

	return true
end

function BuffSets.DeleteBuffSet(setName)
	local buffset = BuffSets.Sets[setName]

	local availableSpecs =  MereHealingFrames.Config.UI.CountAvailableSpecs()
	local maxSpecs = math.min(availableSpecs, MereHealingFrames.StaticGlobals.numberOfSoulSpecs)
	for i=1, maxSpecs do
		if buffset.SoulSpecs[i] then
			print(string.format("Buff Set %s is still in use for soul spec %d", setName, i))
			return false
		end
	end

	BuffSets.Sets[setName] = nil
	return true
end


function BuffSets.RenameSet(setName, newSetName)
	local buffset = BuffSets.Sets[setName]

	if not buffset or BuffSets.Sets[newSetName] then
		print("Unable to rename set")
		return false
	end

	BuffSets.Sets[setName] = nil
	BuffSets.Sets[newSetName] = buffset
	return true
end

-- function BuffSets.CreateNewTracker(buffSet, newTrackerName)
-- end

-- function BuffSets.DeleteTracker(buffSet, trackerName)
-- end

-- function BuffSets.RenameTracker(buffSet, setName, newSetName)
	-- if not buffSet.Trackers[setName] or not buffSet.Trackers[newSetName] then
		-- return false
	-- end

	-- local tracker = buffSet.Trackers[setName]
	-- buffSet.Trackers[setName] = nil
	-- buffSet.Trackers[newSetName] = tracker
	-- return true
-- end

function BuffSets.UpdateCurrentBuffs()
	for unitId, playerInfo in pairs(MereHealingFrames.RaidManagement.Units) do
		playerInfo.buffMgmt:RefreshBuffSet(BuffSets.CurrentSet)
	end
end

function BuffSets.GetTracker(buffSlot)
	for trackerName, tracker in pairs(BuffSets.CurrentSet.Trackers) do
		if tracker.buffSlots[buffSlot] then
			return trackerName, tracker
		end
	end
	return nil, nil
end