--Minetest
--Copyright (C) 2014 sapier
--
--This program is free software; you can redistribute it and/or modify
--it under the terms of the GNU Lesser General Public License as published by
--the Free Software Foundation; either version 2.1 of the License, or
--(at your option) any later version.
--
--This program is distributed in the hope that it will be useful,
--but WITHOUT ANY WARRANTY; without even the implied warranty of
--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--GNU Lesser General Public License for more details.
--
--You should have received a copy of the GNU Lesser General Public License along
--with this program; if not, write to the Free Software Foundation, Inc.,
--51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.


local function current_game()
	local last_game_id = core.settings:get("menu_last_game")
	local game, index = pkgmgr.find_by_gameid(last_game_id)

	return game
end

local function get_formspec(tabview, name, tabdata)
	local retval = ""

	local index = filterlist.get_current_index(menudata.worldlist,
			tonumber(core.settings:get("mainmenu_last_selected_world")))

	retval = {
		"container[0.375,0.375]",
		"box[11,-0.375;4.125,9;#ACACAC33]",
		--"field[1.75,0;5.125,0.8;query;;", query, "]",
		--"button[6.875,0;1.5,0.8;search;", fgettext("Search"), "]",
		"textlist[0,0;10.625,8.25;sp_worlds;", menu_render_worldlist(), ";", index, "]",
	}

	do
		retval[#retval + 1] = "container[11.375,0.2]"
		local enable_server = core.settings:get_bool("enable_server")
		local options = {
			{ name = "creative_mode", text = fgettext("Creative Mode") },
			{ name = "enable_damage", text = fgettext("Enable Damage") },
			{ name = "enable_server", text = fgettext("Host Server") },
		}

		if enable_server then
			options[#options + 1] = { name = "server_announce", text = fgettext("Announce Server") }
		end

		local y = 0
		for _, opt in pairs(options) do
			retval[#retval + 1] = "checkbox[0,"
			retval[#retval + 1] = y
			retval[#retval + 1] =";cb_"
			retval[#retval + 1] = opt.name
			retval[#retval + 1] = ";"
			retval[#retval + 1] = opt.text
			retval[#retval + 1] = ";"
			retval[#retval + 1] = dump(core.settings:get_bool(opt.name))
			retval[#retval + 1] = "]"

			y = y + 0.5
		end

		y = y + 0.25

		if enable_server then
			retval[#retval + 1] = "container[0,"
			retval[#retval + 1] = y
			retval[#retval + 1] = "]label[0,0;"
			retval[#retval + 1] = fgettext("Name/Password")
			retval[#retval + 1] = "]"
			retval[#retval + 1] = "field[0,0.3;3.375,0.5;te_playername;;"
			retval[#retval + 1] = core.formspec_escape(core.settings:get("name"))
			retval[#retval + 1] = "]"
			retval[#retval + 1] = "pwdfield[0,1;3.375,0.5;te_passwd;]"

			local bind_addr = core.settings:get("bind_address")
			if bind_addr ~= nil and bind_addr ~= "" then
				retval[#retval + 1] = "field[0,2.2;2.25,0.5;te_serveraddr;" .. fgettext("Bind Address")
				retval[#retval + 1] = ";"
				retval[#retval + 1] = core.formspec_escape(core.settings:get("bind_address"))
				retval[#retval + 1] = "]"
				retval[#retval + 1] = "field[2.3,2.2;1.25,0.5;te_serverport;"
				retval[#retval + 1] = fgettext("Port")
				retval[#retval + 1] = ";"
				retval[#retval + 1] = core.formspec_escape(core.settings:get("port"))
				retval[#retval + 1] = "]"
			else
				retval[#retval + 1] = "field[0,2.2;3.375,0.5;te_serverport;"
				retval[#retval + 1] = fgettext("Server Port")
				retval[#retval + 1] = ";"
				retval[#retval + 1] = core.formspec_escape(core.settings:get("port"))
				retval[#retval + 1] = "]"
			end
			retval[#retval + 1] = "container_end[]"
		end

		if index > 0 then
			retval[#retval + 1] = "container[0,5.15]"
			retval[#retval + 1] = "button[0,0;3.375,0.8;world_delete;"
			retval[#retval + 1] = fgettext("Delete")
			retval[#retval + 1] = "]"
			retval[#retval + 1] = "button[0,1.05;3.375,0.8;world_configure;"
			retval[#retval + 1] = fgettext("Configure")
			retval[#retval + 1] = "]"
			retval[#retval + 1] = "button[0,2.1;3.375,0.8;play;"
			retval[#retval + 1] = fgettext("Play Game")
			retval[#retval + 1] = "]"
			--	"button[4,3.95;2.6,1;world_delete;", fgettext("Delete"), "]",
			--"button[6.5,3.95;2.8,1;world_configure;", fgettext("Configure"), "]",
			retval[#retval + 1] = "container_end[]"
		else
			retval[#retval + 1] = "container[0,5.15]"
			retval[#retval + 1] = "box[0,0;2.625,0.8;#333]"
			retval[#retval + 1] = "box[0,1.05;2.625,0.8;#333]"
			retval[#retval + 1] = "box[0,2.1;2.625,0.8;#333]"
			retval[#retval + 1] = "container_end[]"
		end


		retval[#retval + 1] = "container_end[]"
	end

	return table.concat(retval, "") .. "container_end[]"
end

local function main_button_handler(this, fields, name, tabdata)

	assert(name == "local")

	local world_doubleclick = false

	if fields["sp_worlds"] ~= nil then
		local event = core.explode_textlist_event(fields["sp_worlds"])
		local selected = core.get_textlist_index("sp_worlds")

		menu_worldmt_legacy(selected)

		if event.type == "DCL" then
			world_doubleclick = true
		end

		if event.type == "CHG" and selected ~= nil then
			core.settings:set("mainmenu_last_selected_world",
				menudata.worldlist:get_raw_index(selected))
			return true
		end
	end

	if menu_handle_key_up_down(fields,"sp_worlds","mainmenu_last_selected_world") then
		return true
	end

	if fields["cb_creative_mode"] then
		core.settings:set("creative_mode", fields["cb_creative_mode"])
		local selected = core.get_textlist_index("sp_worlds")
		menu_worldmt(selected, "creative_mode", fields["cb_creative_mode"])

		return true
	end

	if fields["cb_enable_damage"] then
		core.settings:set("enable_damage", fields["cb_enable_damage"])
		local selected = core.get_textlist_index("sp_worlds")
		menu_worldmt(selected, "enable_damage", fields["cb_enable_damage"])

		return true
	end

	if fields["cb_enable_server"] then
		core.settings:set("enable_server", fields["cb_enable_server"])

		return true
	end

	if fields["cb_server_announce"] then
		core.settings:set("server_announce", fields["cb_server_announce"])
		local selected = core.get_textlist_index("srv_worlds")
		menu_worldmt(selected, "server_announce", fields["cb_server_announce"])

		return true
	end

	if fields["play"] ~= nil or world_doubleclick then
		local selected = core.get_textlist_index("sp_worlds")
		gamedata.selected_world = menudata.worldlist:get_raw_index(selected)

		if core.settings:get_bool("enable_server") then
			if selected ~= nil and gamedata.selected_world ~= 0 then
				gamedata.playername = fields["te_playername"]
				gamedata.password   = fields["te_passwd"]
				gamedata.port       = fields["te_serverport"]
				gamedata.address    = ""

				core.settings:set("port",gamedata.port)
				if fields["te_serveraddr"] ~= nil then
					core.settings:set("bind_address",fields["te_serveraddr"])
				end

				--update last game
				local world = menudata.worldlist:get_raw_element(gamedata.selected_world)
				if world then
					local game, index = pkgmgr.find_by_gameid(world.gameid)
					core.settings:set("menu_last_game", game.id)
				end

				core.start()
			else
				gamedata.errormessage =
					fgettext("No world created or selected!")
			end
		else
			if selected ~= nil and gamedata.selected_world ~= 0 then
				gamedata.singleplayer = true
				core.start()
			else
				gamedata.errormessage =
					fgettext("No world created or selected!")
			end
			return true
		end
	end


	if fields["world_delete"] ~= nil then
		local selected = core.get_textlist_index("sp_worlds")
		if selected ~= nil and
			selected <= menudata.worldlist:size() then
			local world = menudata.worldlist:get_list()[selected]
			if world ~= nil and
				world.name ~= nil and
				world.name ~= "" then
				local index = menudata.worldlist:get_raw_index(selected)
				local delete_world_dlg = create_delete_world_dlg(world.name,index)
				delete_world_dlg:set_parent(this)
				this:hide()
				delete_world_dlg:show()
				mm_texture.update("singleplayer",current_game())
			end
		end

		return true
	end

	if fields["world_configure"] ~= nil then
		local selected = core.get_textlist_index("sp_worlds")
		if selected ~= nil then
			local configdialog =
				create_configure_world_dlg(
						menudata.worldlist:get_raw_index(selected))

			if (configdialog ~= nil) then
				configdialog:set_parent(this)
				this:hide()
				configdialog:show()
				mm_texture.update("singleplayer",current_game())
			end
		end

		return true
	end
end

local function on_change(type, old_tab, new_tab)
	if type == "ENTER" then
		local game = current_game()

		if game then
			menudata.worldlist:set_filtercriteria(game.id)
			core.set_topleft_text(game.name)
			mm_texture.update("singleplayer",game)
		end
	else
		menudata.worldlist:set_filtercriteria(nil)
		core.set_topleft_text("")
		mm_texture.update(new_tab,nil)
	end
end

--------------------------------------------------------------------------------
return {
	name = "local",
	caption = fgettext("Load Game"),
	cbf_formspec = get_formspec,
	cbf_button_handler = main_button_handler,
	on_change = on_change
}