local Classes = MyCollection.Internals.Classes
local Constants = MyCollection.Internals.Constants
local Logger = MyCollection.Internals.Dependencies.Logger
local Dependencies = MyCollection.Internals.Dependencies

Classes.Collection = {}
Classes.Collection.__index = Classes.Collection

local Collection = Classes.Collection

-- Constructor
function Collection.New(savedTable)
    local instance = {}
    setmetatable(instance, Collection)

    instance:Initialize(savedTable)
    return instance
end

-- Fields
Collection.savedTableReference = nil

-- Properties
Collection.sets = {}

-- Functions
function Collection:GetSets()
    return self.sets
end

function Collection:AddItem(item)
    if (next(self.sets) ~= nil) then
        for key, set in pairs(self.sets) do
            if set:GetSetId() == item.setId then
                self.sets[key]:AddItem(item)
            end
        end
    end
end

function Collection:RemoveItem(item)
    if (next(self.sets) ~= nil) then
        for key, set in pairs(self.sets) do
            if set:GetSetId() == item.setId then
                self.sets[key]:RemoveItem(item)
            end
        end
    end
end

function Collection:AddSet(setId, armorType, orderNumber)
    local newId = 0
    if (next(self.sets) ~= nil) then
        for key, _ in pairs(self.sets) do
            if key > newId then
                newId = key
            end
        end
    end
    newId = newId + 1
    self.savedTableReference.sets[newId] = {}
    self.sets[newId] = Classes.Set.New(self.savedTableReference.sets[newId], setId, nil, armorType, orderNumber)
end

function Collection:RemoveSet(id)
    table.remove(self.sets, id)
    table.remove(self.savedTableReference.sets, id)
end

function Collection:Clear()
    self.sets = {}
    self.savedTableReference.sets = {}
end

function Collection:Initialize(savedTable)
    self.savedTableReference = savedTable

    if (next(savedTable.sets) ~= nil) then
        for id, set in pairs(savedTable.sets) do
            self.sets[id] = Classes.Set.New(savedTable.sets[id], set.setId, set.setName, set.armorType, set.orderNumber)
        end
    end
end