--[[------------------------------------------------
	-- Love Frames - A GUI library for LOVE --
	-- Copyright (c) 2013 Kenny Shields --
--]]------------------------------------------------

-- skins library
loveframes.skins = {}

-- available skins
loveframes.skins.available = {}

--[[---------------------------------------------------------
	- func: Register(skin)
	- desc: registers a skin
--]]---------------------------------------------------------
function loveframes.skins.Register(skin)
	
	local name = skin.name
	local author = skin.author
	local version = skin.version
	local base = skin.base
	local newskin = false
	
	if name == "" or not name then
		loveframes.util.Error("Skin registration error: Invalid or missing name data.")
	end
	
	if author == "" or not author then
		loveframes.util.Error("Skin registration error: Invalid or missing author data.")
	end
	
	if version == "" or not version then
		loveframes.util.Error("Skin registration error: Invalid or missing version data.")
	end
	
	local namecheck = loveframes.skins.available[name]
	if namecheck then
		loveframes.util.Error("Skin registration error: A skin with the name '" ..name.. "' already exists.")
	end
	
	local dir = loveframes.config["DIRECTORY"] .. "/skins/" ..name
	local dircheck = love.filesystem.isDirectory(dir)
	if not dircheck then
		loveframes.util.Error("Skin registration error: Could not find a directory for skin '" ..name.. "'.")
	end
	
	local imagedir = skin.imagedir or dir .. "/images"
	local imagedircheck = love.filesystem.isDirectory(imagedir)
	if not imagedircheck then
		loveframes.util.Error("Skin registration error: Could not find an image directory for skin '" ..name.. "'.")
	end
	
	if base then
		local basename = base
		base = loveframes.skins.Get(base)
		if not base then
			loveframes.util.Error("Could not find base skin '" ..basename.. "' for skin '" ..name.. "'.")
		end
		newskin = loveframes.util.DeepCopy(base)
		newskin.name = name
		newskin.author = author
		newskin.version = version
		newskin.imagedir = imagedir
		local skincontrols = skin.controls
		local basecontrols = base.controls
		if skincontrols and basecontrols then
			for k, v in pairs(skincontrols) do
				newskin.controls[k] = v
			end
			for k, v in pairs(skin) do
				if type(v) == "function" then
					newskin[k] = v
				end
			end
		end
	end
	
	if newskin then
		loveframes.skins.available[name] = newskin
	else
		loveframes.skins.available[name] = skin
	end
	
	loveframes.skins.available[name].dir = dir
	loveframes.skins.available[name].images = {}
	
	local indeximages = loveframes.config["INDEXSKINIMAGES"]
	if indeximages then
		local images = loveframes.util.GetDirectoryContents(imagedir)
		for k, v in ipairs(images) do
			local filename = v.name
			local extension = v.extension
			local fullpath = v.fullpath
			local key = filename .. "." .. extension
			if extension ~= "db" then
				loveframes.skins.available[name].images[key] = love.graphics.newImage(fullpath)
			end
		end
	end
	
end

--[[---------------------------------------------------------
	- func: GetAvailable()
	- desc: gets all available skins
--]]---------------------------------------------------------
function loveframes.skins.GetAvailable()

	local available = loveframes.skins.available
	return available
	
end

--[[---------------------------------------------------------
	- func: Get(name)
	- desc: gets a skin by its name
--]]---------------------------------------------------------
function loveframes.skins.Get(name)

	local available = loveframes.skins.available
	local skin = available[name] or false
	
	return skin
	
end

--[[---------------------------------------------------------
	- func: SetControl(name, control, value)
	- desc: changes the value of a control in the 
			specified skin
--]]---------------------------------------------------------
function loveframes.skins.SetControl(name, control, value)

	local skin = loveframes.skins.Get(name)
	
	if skin then
		if skin.controls and skin.controls[control] then
			skin.controls[control] = value
		end
	end
	
end

--[[---------------------------------------------------------
	- func: SetImage(name, image, value)
	- desc: changes the value of an image index in
			the images table of the specified skin
--]]---------------------------------------------------------
function loveframes.skins.SetImage(name, image, value)

	local skin = loveframes.skins.Get(name)
	
	if skin then
		if skin.images and skin.images[image] then
			skin.images[image] = value
		end
	end
	
end

--[[---------------------------------------------------------
	- func: SetImageDirectory(name, dir)
	- desc: sets the image directory of a skin
--]]---------------------------------------------------------
function loveframes.skins.SetImageDirectory(name, dir)

	local skin = loveframes.skins.Get(name)
	
	if skin then
		skin.imagedir = dir
	end
	
end

--[[---------------------------------------------------------
	- func: ReloadImages(name)
	- desc: reloads a skin's images
--]]---------------------------------------------------------
function loveframes.skins.ReloadImages(name)

	local skin = loveframes.skins.Get(name)
	local indeximages = loveframes.config["INDEXSKINIMAGES"]
	
	if skin and indeximages then
		local basedir = loveframes.config["DIRECTORY"]
		local imagedir = skin.imagedir or basedir .. "/skins/" ..name.. "/images"
		local dircheck = love.filesystem.isDirectory(imagedir)
		if dircheck then
			local images = loveframes.util.GetDirectoryContents(imagedir)
			for k, v in ipairs(images) do
				local filename = v.name
				local extension = v.extension
				local fullpath = v.fullpath
				loveframes.skins.available[name].images[filename .. "." .. extension] = love.graphics.newImage(fullpath)
			end
		end
	end
	
end