local _G = getfenv(0)
local LibStub = _G.LibStub

local AtlasLoot = _G.AtlasLoot
local Options = AtlasLoot.Options
local AL = AtlasLoot.Locales

local Addons = _G.AtlasLoot.Addons
local GetAddon = Addons.GetAddon
local FavAddon = _G.AtlasLoot.Addons:GetAddon("Favourites")
local Sources = _G.AtlasLoot.Addons:GetAddon("Sources")

local AceGUI = LibStub("AceGUI-3.0")

-- lua
local pairs = _G.pairs
local format = _G.format

local count = 0

local function UpdateItemFrame(addon)
	if addon then
		Addons:UpdateStatus(addon:GetName())
	end
	if AtlasLoot.GUI.frame and AtlasLoot.GUI.frame:IsShown() then
		AtlasLoot.GUI.ItemFrame:Refresh(true)
	end
end

local function ImportItemList(listName, listID, isGlobal)
	local frame = AceGUI:Create("Frame")
	frame:SetTitle(AL["Import item list"])
	frame:SetStatusText(listName)
	frame:SetCallback("OnClose", function(widget) AceGUI:Release(widget) end)
	frame:SetLayout("Flow")

	local checkBox = AceGUI:Create("CheckBox")
	checkBox:SetValue(false)
	checkBox:SetLabel(AL["Replace existing items"])
	frame:AddChild(checkBox)

	local multiEditbox = AceGUI:Create("MultiLineEditBox")
	multiEditbox:SetText("")
	multiEditbox:SetFocus(true)
	multiEditbox:SetFullWidth(true)
	multiEditbox:SetFullHeight(true)
	multiEditbox:SetCallback("OnEnterPressed", function(self, script, text)
		local addedItems = FavAddon:ImportItemList(listID, isGlobal, text, checkBox:GetValue())
		UpdateItemFrame(FavAddon)
		AtlasLoot:Print(format(AL["Added |cff00ff00%d|r items into list |cff00ff00%s|r."], addedItems or 0, listName))
		frame:Hide()
	end)
	frame:AddChild(multiEditbox)
end

local function ExportItemList(listName, listString)
	local frame = AceGUI:Create("Frame")
	frame:SetTitle(AL["Export item list"])
	frame:SetStatusText(listName)
	frame:SetCallback("OnClose", function(widget) AceGUI:Release(widget) end)
	frame:SetLayout("Fill")

	local multiEditbox = AceGUI:Create("MultiLineEditBox")
	multiEditbox:SetText(listString or "")
	multiEditbox:HighlightText(0)
	multiEditbox:DisableButton(true)
	multiEditbox:SetFocus(true)
	multiEditbox:SetFullWidth(true)
	multiEditbox:SetFullHeight(true)
	frame:AddChild(multiEditbox)
end

local function CreateFavouriteOptions()
	count = count + 1
	local AddonName = FavAddon:GetName()
	local t = {
		type = "group",
		name = AL["Favourites"],
		order = count,
		get = function(info) return FavAddon.db[info[#info]] end,
		set = function(info, value)
			FavAddon.db[info[#info]] = value
			Addons:UpdateStatus("Favourites")
		end,
		args = {
			enabled = {
				order = 1,
				type = "toggle",
				width = "full",
				name = _G.ENABLE,
				set = function(info, value)
					FavAddon.db[info[#info]] = value
					UpdateItemFrame(FavAddon)
				end
			},
			showIconInTT = {
				order = 2,
				type = "toggle",
				width = "full",
				name = AL["Show favourite item icon in item tooltip"],
			},
			showListInTT = {
				order = 3,
				type = "toggle",
				width = "full",
				name = AL["Show listname in item tooltip"],
			},
			global = {
				order = 4,
				type = "toggle",
				width = "full",
				name = AL["Global lists"],
				get = function(info) return FavAddon:GetDb().activeList[2] end,
				set = function(info, value)
					local db = FavAddon:GetDb()
					db.activeList[1] = value and FavAddon.BASE_NAME_G or FavAddon.BASE_NAME_P
					db.activeList[2] = value
					UpdateItemFrame(FavAddon)
				end
			},
			list = {
				type = "select",
				order = 5,
				name = AL["Active list"],
				width = "double",
				values = function()
					local db = FavAddon:GetDb()
					local listDb
					local list = {}
					if db.activeList[2] == true then
						listDb = FavAddon:GetGlobaleLists()
					else
						listDb = FavAddon:GetProfileLists()
					end
					for k, v in pairs(listDb) do
						list[k] = FavAddon:GetListName(k, db.activeList[2] == true, true)
					end
					return list
				end,
				sorting = function()
					local db = FavAddon:GetDb()
					local listDb
					local list = {}
					if db.activeList[2] == true then
						listDb = FavAddon:GetGlobaleLists(true)
					else
						listDb = FavAddon:GetProfileLists(true)
					end
					for k, v in ipairs(listDb) do
						list[k] = v.id
					end
					return list
				end,
				get = function(info) return FavAddon:GetDb().activeList[1] end,
				set = function(info, value)
					FavAddon:GetDb().activeList[1] = value
					UpdateItemFrame(FavAddon)
				end,
			},
			addNewList = {
				order = 6,
				type = 'execute',
				name = AL["Add new list"],
				confirm = true,
				func = function()
					local newList = FavAddon:AddNewList(FavAddon:GetDb().activeList[2])
					if newList then
						FavAddon:GetDb().activeList[1] = newList
						UpdateItemFrame(FavAddon)
					end
				end,
			},
			deleteList = {
				order = 7,
				type = 'execute',
				name = AL["Delete list"],
				confirm = true,
				disabled = function(info)
					local db = FavAddon:GetDb().activeList
					if db[1] == FavAddon.BASE_NAME_P or db[1] == FavAddon.BASE_NAME_G then
						return true
					else
						return false
					end
				end,
				func = function()
					local db = FavAddon:GetDb().activeList
					local deleted = FavAddon:RemoveList(db[1], db[2])
					if deleted then
						db[1] = db[2] and FavAddon.BASE_NAME_G or FavAddon.BASE_NAME_P
						UpdateItemFrame(FavAddon)
					end
				end,
			},
			headerSetting = {
				order = 10,
				type = "header",
				name = AL["Selected list settings"],
			},
			name = {
				order = 11,
				type = 'input',
				name = _G.NAME,
				width = "full",
				func = function() FavAddon:AddNewList() end,
				get = function(info) return FavAddon:GetActiveListName() end,
				set = function(info, value)
					FavAddon:SetActiveListName(value)
					UpdateItemFrame(FavAddon)
				end,
			},
			import = {
				order = 12,
				type = "execute",
				name = AL["Import item list"],
				func = function(info)
					local db = FavAddon:GetDb()
					ImportItemList(FavAddon:GetActiveListName(), db.activeList[1], db.activeList[2])
				end,
			},
			export = {
				order = 13,
				type = "execute",
				name = AL["Export item list"],
				func = function(info)
					local db = FavAddon:GetDb()
					ExportItemList(FavAddon:GetActiveListName(), FavAddon:ExportItemList(db.activeList[1], db.activeList[2]))
				end,
			},
			clearList = {
				order = 14,
				type = "execute",
				name = AL["Clear list"],
				desc = function() return format(AL["Remove |cffff0000%d|r items from list."], FavAddon:GetNumItemsInList()) end,
				confirm = true,
				func = function(info)
					FavAddon:ClearList()
					UpdateItemFrame()
				end,
			},
			useGlobal = {
				order = 15,
				type = "toggle",
				width = "full",
				name = AL["Always active for all Profiles."],
				desc = AL["Always marks items as favourite for every profile if enabled."],
				hidden = function(info) return not FavAddon:GetDb().activeList[2] end,
				get = function(info) return FavAddon:ListIsGlobalActive(FavAddon:GetDb().activeList[1]) end,
				set = function(info, value)
					local db = FavAddon:GetDb()
					if value then
						FavAddon:AddIntoShownList(db.activeList[1], db.activeList[2], true)
					else
						FavAddon:RemoveFromShownList(db.activeList[1], db.activeList[2], true)
					end
					UpdateItemFrame(FavAddon)
				end
			},
			useProfile = {
				order = 16,
				type = "toggle",
				width = "full",
				name = function() return format(AL["Always active for profile: |cff00ff00%s|r"], AtlasLoot.dbRaw:GetCurrentProfile()) end,
				desc = function() return format(AL["Always marks items as favourite for profile |cff00ff00%s|r if enabled."], AtlasLoot.dbRaw:GetCurrentProfile()) end,
				get = function(info) return FavAddon:ListIsProfileActive(FavAddon:GetDb().activeList[1]) end,
				set = function(info, value)
					local db = FavAddon:GetDb()
					if value then
						FavAddon:AddIntoShownList(db.activeList[1], db.activeList[2], false)
					else
						FavAddon:RemoveFromShownList(db.activeList[1], db.activeList[2], false)
					end
					UpdateItemFrame(FavAddon)
				end
			},
			iconSelection = {
				type = "group",
				name = AL["Icon"],
				inline = true,
				order = -1,
				get = function(info) return FavAddon.db[info[#info]] end,
				set = function(info, value)
					FavAddon.db[info[#info]] = value
					FavAddon:SetIcon(value)
				end,
				args = {
					useIcon = {
						order = 1,
						type = "toggle",
						width = "full",
						name = _G.DEFAULT,
						disabled = function(info) return not FavAddon:HasIcon() end,
						get = function(info) return not FavAddon:HasIcon() end,
						set = function(info, value)
							FavAddon:SetIcon(nil)
							UpdateItemFrame(FavAddon)
						end
					},
				},
			},
		},
	}

	-- icons
	local args = t.args.iconSelection.args
	local iconList = FavAddon.IconList
	local count = 1
	for i = 3, #iconList do
		local icon = iconList[i]
		count = count + 1
		args[icon] = {
			order = count,
			type = "execute",
			name = function(info)
				return FavAddon:GetIcon() == info[#info] and "^" or ""
			end,
			image = icon,
			imageWidth = 20,
			imageHeight = 20,
			width = 0.3,
			func = function(info)
				FavAddon:SetIcon(info[#info])
				UpdateItemFrame(FavAddon)
			end,
		}
	end

	return t
end

local function CreateSourceOptions()
	local AddonName = Sources:GetName()
	count = count + 1

	local t = {
		type = "group",
		name = AL["Sources"],
		order = count,
		get = function(info) return Sources.db[info[#info]] end,
		set = function(info, value)
			Sources.db[info[#info]] = value
			Addons:UpdateStatus("Sources")
		end,
		args = {
			enabled = {
				order = 1,
				type = "toggle",
				width = "full",
				name = _G.ENABLE,
				desc = format(AL["This loads the |cff999999%s|r module."], "AtlasLootClassic_Data")
			},
			showDropRate = {
				order = 2,
				type = "toggle",
				width = "full",
				name = AL["Show drop rate if available."],
				desc = format(AL["This loads the |cff999999%s|r module."], "AtlasLootClassic_DungeonsAndRaids")
			},
			showProfRank = {
				order = 3,
				type = "toggle",
				width = "full",
				name = AL["Show profession rank if available."],
			},
			showRecipeSource = {
				order = 4,
				type = "toggle",
				width = "full",
				name = AL["Show recipe source if available."],
			},
			showVendorPrices = {
				order = 5,
				type = "toggle",
				width = "full",
				name = AL["Show vendor prices if available."],
			},
			showLineBreak = {
				order = 6,
				type = "toggle",
				width = "full",
				name = AL["Add line break before source."],
			},
			typeSelection = {
				type = "group",
				name = AL["Icon"],
				inline = true,
				order = -1,
				get = function(info) return Sources.db["Sources"][tonumber(info[#info])] end,
				set = function(info, value)
					Sources.db["Sources"][tonumber(info[#info])] = value
					Addons:UpdateStatus("Sources")
				end,
				args = {},
			},
		}
	}

	local data = t.args.typeSelection.args

	for num, srcName in ipairs(Sources:GetSourceTypes()) do
		data[tostring(num)] = {
			order = num,
			type = "toggle",
			--width = "full",
			name = srcName,
		}
	end

	return t
end

-- Addons
Options.orderNumber = Options.orderNumber + 1
Options.config.args.addons = {
	type = "group",
	name = _G.ADDONS,
	order = Options.orderNumber,
	args = {
		sources = CreateSourceOptions(),
		favourite = CreateFavouriteOptions(),
	},
}
