-- Inventory System -- module (finished).

local M = {}

-------------------------------------------------------------------
-- Item class
-------------------------------------------------------------------

local Item = {}
Item.__index = Item

function Item.new(name, weight, value)
    local self = setmetatable({}, Item)
    self.name = name
    self.weight = weight
    self.value = value
    return self
end

function Item:describe()
    return string.format("%s (%.1fkg, %dg)", self.name, self.weight, self.value)
end

-------------------------------------------------------------------
-- Inventory class
-------------------------------------------------------------------

local Inventory = {}
Inventory.__index = Inventory

function Inventory.new()
    local self = setmetatable({}, Inventory)
    self.items = {}
    return self
end

function Inventory:add(item)
    table.insert(self.items, item)
end

function Inventory:remove(name)
    for i, item in ipairs(self.items) do
        if item.name == name then
            return table.remove(self.items, i)
        end
    end
    return nil
end

function Inventory:totalWeight()
    local total = 0
    for _, item in ipairs(self.items) do
        total = total + item.weight
    end
    return total
end

function Inventory:totalValue()
    local total = 0
    for _, item in ipairs(self.items) do
        total = total + item.value
    end
    return total
end

function Inventory:list()
    print(string.format("Inventory (%d items):", #self.items))
    for _, item in ipairs(self.items) do
        print("  - " .. item:describe())
    end
    print(string.format("  Totals: %.2fkg, %dg",
        self:totalWeight(), self:totalValue()))
end

M.Item = Item
M.Inventory = Inventory
return M
