---@meta

SMODS.GUI = {}
SMODS.GUI.DynamicUIManager = {}

---@type string|"achievements"|"config"|"credits"|"mod_desc"|"additions"
SMODS.LAST_SELECTED_MOD_TAB = ""

---@type boolean?
SMODS.IN_MODS_TAB = nil

---@enum G.UIT
G.UIT = {
    T=1, -- Text node
    B=2, -- Box node
    C=3, -- Column node (orients children vertically)
    R=4, -- Row node (orients children horizontally)
    O=5, -- Object node 
    ROOT=7, -- Top-level node
    S=8, -- Slider node 
    I=9, -- Input node
    padding = 0, --default padding
}

---@class UINode.config: table
---@field align? string String *MUST* be two or less letters, 1st indicating vertical alignment and 2nd horizontal.
---@field h? number Fixed height.
---@field minh? number Minimum height.
---@field maxh? number Maximum height.
---@field w? number Fixed width.
---@field minw? number Minimum width.
---@field maxw? number Maximum width.
---@field padding? number Extra padding in the edges of the node.
---@field r? number Roundness of the node's corners.
---@field colour? table HEX color fill of the node.
---@field no_fill? boolean Set the node to no fill. Also sets text color for text nodes.
---@field outline? number Thickness of the outline.
---@field outline_colour? table HEX color of the outline.
---@field emboss? number How raised the current node is from its parent node.
---@field hover? boolean Renders the node as hovering above the parent node.
---@field shadow? boolean Renders a shadow below the node.
---@field juice? boolean Applied the `juice_up` animation on the node when loaded.
---@field id? string Sets an ID for the node.
---@field instance_type? "NODE"|"MOVEABLE"|"UIBOX"|"CARDAREA"|"CARD"|"UI_BOX"|"ALERT"|"POPUP" Sets the layer this node is drawn on.
---@field ref_table? table Table containing data relevant to this node.
---@field ref_value? string String corresponding to a key inside of `ref_table`.
---@field func? string Key to the function called when this node is drawn.
---@field button? string Key to the function called when this node is clicked.
---@field tooltip? table|{title: string, text: string[]} Displays a tooltip when this node is hovered.
---@field detailed_tooltip? table Contains the center of an object, turned into a detailed tooltip displayed when this node is hovered.
---@field text? string String to displayed as text.
---@field scale? number Size multiplier for text.
---@field vert? boolean Sets if the text is drawn vertically.
---@field object? Node Object to render.
---@field role? "Major"|"Minor"|"Glued" Sets object's role type.

--- Internal class for annotating UIBox/UIElement tables before being turned into objects.
---@class UINode: table
---@field n G.UIT Type of UIBox/UIElement
---@field config UINode.config Config of the UINode.
---@field nodes? UINode[] Child UINodes

-- UI Functions
---@param str string
---@return any
--- Unpacks provided string. 
function STR_UNPACK(str) end

---@param args table
---@return UINode
--- Creates UIBox for individual mod tabs. 
function create_UIBox_mods(args) end

---@param mod Mod
---@return UINode
--- Creates UIBox for Mod's Description tab. 
function buildModDescTab(mod) end

---@param mod Mod
---@return UINode
--- Creates UIBox for Mod's "Additions" tab. 
function buildAdditionsTab(mod) end

---@param e? table
--- Button function for "Other" collections menu
G.FUNCS.your_collection_other_gameobjects = function(e) end

---@return UINode?
--- Creates UIBox for "Other" collections menu
function create_UIBox_Other_GameObjects() end

---@param e? table
--- Button function for "Consumables" collections menu UIBox
G.FUNCS.your_collection_consumables = function(e) end

---@return UINode
--- Creates UIBox for "Consumables" collections menu
function create_UIBox_your_collection_consumables() end

---@param args? table
--- Pages button function for "Consumables" collection menu
G.FUNCS.your_collection_consumables_page = function(args) end

---@param page? number
---@return UINode
--- Creates UIBox for "Consumables" collection menu pages. 
G.UIDEF.consumable_collection_page = function(page) end

---@param mod Mod
---@param current_page? number
---@return UINode
--- Creates UIBox for Mod's "Achievements" tab. 
function buildAchievementsTab(mod, current_page) end

---@param args? table
--- Pages button function for "Achievements" tab
G.FUNCS.achievments_tab_page = function(args) end

---@param pool table[]
---@param set? string Only objects with matching set will be tallied. 
---@return {tally: 0|number, of: 0|number} 
--- Tallies all objects within `pool` that are discovered. 
function modsCollectionTally(pool, set) end

---@param mod Mod
---@return UINode
--- Creates Mod tag UI for Mods list menu. 
function buildModtag(mod) end

---@param options? table
--- Opens "Mods" directory. 
function G.FUNCS.openModsDirectory(options) end

---@param mod Mod
---@return table
--- Loads mod config. 
function SMODS.load_mod_config(mod) end

---@param mod Mod
---@return boolean
--- Saves mod config
function SMODS.save_mod_config(mod) end

--- Saves all mod configs. 
function SMODS.save_all_config() end

---@param e? table
--- Exits mods tab. 
function G.FUNCS.exit_mods(e) end

---@return UINode
--- Creates UIBox for SMODS Menu. 
function create_UIBox_mods_button() end

---@param e? table
--- Updates achievements settings. 
function G.FUNCS.update_achievement_settings(e) end

---@param e? table
--- Button function for Steamodded Github link. 
function G.FUNCS.steamodded_github(e) end

---@param e? table
--- Updates UI to display SMODS menu. 
function G.FUNCS.mods_button(e) end

---@param args table
--- Updates mod list. 
function G.FUNCS.update_mod_list(args) end

---@param args table
---@return UINode
--- Same as Balatro base game code, but accepts a value to match against (rather than the index in the option list)
--- e.g. create_option_cycle({ current_option = 1 })  vs. SMODS.GUI.createOptionSelector({ current_option = "Page 1/2" })
function SMODS.GUI.createOptionSelector(args) end

---@param args table
---@return UINode
-- Initialize a tab with sections that can be updated dynamically (e.g. modifying text labels, showing additional UI elements after toggling buttons, etc.)
function SMODS.GUI.DynamicUIManager.initTab(args) end

---@param uiDefinitions table<string, UIBox|table>
--- Updates all provided dynamic UIBoxes. 
function SMODS.GUI.DynamicUIManager.updateDynamicAreas(uiDefinitions) end

---@return UINode
--- Define the content in the pane that does not need to update
--- Should include OBJECT nodes that indicate where the dynamic content sections will be populated
--- EX: in this pane the 'modsList' node will contain the dynamic content which is defined in the function below
function SMODS.GUI.staticModListContent() end

---@param page? number
---@return UINode
--- Creates mod list. 
function SMODS.GUI.dynamicModListContent(page) end

---@param args table
--- Updates mipmap. 
function G.FUNCS.SMODS_change_mipmap(args) end

---@class CardCollection
---@field w_mod? number CardArea width modifier. 
---@field h_mod? number CardArea height modifier. 
---@field card_scale? number Card scale modifier. 
---@field collapse_single_page? boolean Removes a row if there's only one page. 
---@field area_type? string CardArea type. 
---@field center? string Key to a center. All created cards will have this as their center. 
---@field no_materialize? boolean Sets if the card play materialize animations when created. 
---@field back_func? string Back function of the collections UI. 
---@field hide_single_page? boolean Hides the page portion of the UI if there's only one page. 
---@field infotip? string Text displayed above the collections menu (e.x. Edition/Seal/Enhancement). 
---@field snap_back? boolean Some controller related. TODO define more specific term
---@field modify_card? fun(card: Card|table, center: SMODS.GameObject|table, i: number, j: number) Modifies all created cards for this collection. 

---@param _pool table
---@param rows number[]
---@param args CardCollection
---@return UINode
--- Creates a default collections UIBox
function SMODS.card_collection_UIBox(_pool, rows, args) end

---@return UINode
--- Creates UIBox for "Jokers" collection menu
function create_UIBox_your_collection_jokers() end

---@return UINode
--- Creates UIBox for "Boosters" collection menu
function create_UIBox_your_collection_boosters() end

---@return UINode
--- Creates UIBox for "Vouchers" collection menu
function create_UIBox_your_collection_vouchers() end

---@return UINode
--- Creates UIBox for "Enhancements" collection menu
function create_UIBox_your_collection_enhancements() end

---@return UINode
--- Creates UIBox for "Editions" collection menu
function create_UIBox_your_collection_editions() end

---@return UINode
--- Creates UIBox for "Seals" collection menu
function create_UIBox_your_collection_seals() end

---@param e? table
--- Button function for "Stickers" collection menu
G.FUNCS.your_collection_stickers = function(e) end

---@return UINode
--- Creates UIBox for "Stickers" collection menu
function create_UIBox_your_collection_stickers() end


---@return UINode
---@param table
---@field scale? number Set scale of text
---@field colour? table HEX colour of the container
---@field type string Type of scoring component, ex. 'mult'. Can take the key of a Scoring_Parameter
---@field align? string Must be two letters, first indicates vertical alignment, second indicates horizontal alignment
---@field func? string Reference to function in `G.FUNCS` that controls changing the text - defaults to `'hand_'..type..'_UI_set'`
---@field text? string Key of value in `G.GAME.current_round.current_hand` - defaults to `type..'_text'`
---@field w? number Minimum width
---@field h? number Minimum height
function SMODS.GUI.score_container(args) end