-------------------
-- Player Classes
--

-- NOTE: This is a very simple interface for classes, more features will be
--       added depending on the various mechanisms we will need

-- Global namespace
pclasses = {}

-- API
pclasses.api = {}
pclasses.api.util = {}

-- Configuration
pclasses.conf = {}
pclasses.conf.default_class = "adventurer"
pclasses.conf.superuser_class = "admin"
pclasses.conf.save_interval = 3 * 60
pclasses.conf.datafile = minetest.get_worldpath() .. "/pclasses"
pclasses.conf.gravefile = minetest.get_worldpath() .. "/graveyards"

-- Classes
pclasses.classes = {}

-- Data
pclasses.data = {}
pclasses.data.players = {}
pclasses.data.reserved_items = {}
pclasses.data.hud_ids = {} -- HUD maybe?

dofile(minetest.get_modpath("pclasses") .. "/api.lua")
dofile(minetest.get_modpath("pclasses") .. "/inventory.lua")
dofile(minetest.get_modpath("pclasses") .. "/nodes.lua")

function pclasses.data.load()
	local file = io.open(pclasses.conf.datafile, "r")
	if file then
		local loaded = minetest.deserialize(file:read("*all"))
		file:close()
		if loaded then
			pclasses.data.players = loaded.players or pclasses.data.players
			minetest.log("action", "[PClasses] Loaded data")
		end
	end
end

function pclasses.data.save()
	local file, err = io.open(pclasses.conf.datafile, "w")
	if file then
		file:write(minetest.serialize({
			players = pclasses.data.players,
		}))
		file:close()
		--minetest.log("action", "[PClasses] Saved data")
	else
		minetest.log("error", "[PClasses] Data save failed: open failed: " .. err)
	end
end

local function data_save_loop()
	pclasses.data.save()
	minetest.after(pclasses.conf.save_interval, data_save_loop)
end

pclasses.data.load()

------------------
-- Default class
--

if pclasses.conf.default_class then
	dofile(minetest.get_modpath("pclasses") .. "/" .. pclasses.conf.default_class .. ".lua")
end

minetest.register_on_joinplayer(function(player)
	local pname = player:get_player_name()
	pclasses.api.create_graveyard_inventory(player) --create inventory before
	
	local cname = pclasses.api.get_player_class(pname)
	if cname ~= nil and pclasses.api.get_class_by_name(cname) then
		pclasses.api.set_player_class(pname, cname)
	elseif pclasses.api.get_class_by_name(pclasses.conf.default_class) then
		pclasses.api.set_player_class(pname, pclasses.conf.default_class)
	end
end)

minetest.register_on_shutdown(function()
	pclasses.data.save()
end)

data_save_loop()