/** @noSelfInFile */

import type { Section } from 'anomaly-packer'

declare global {
  namespace utils_ui {
    // Descriptor for a single item stat, as built by prepare_stats_table().
    export interface StatDescriptor {
      index: number
      typ: string
      name: string
      icon_p: string
      icon_n: string
      track: boolean
      magnitude: number
      unit: string
      compare?: boolean
      sign?: boolean
      show_always?: boolean
      condition?: boolean
      section?: Section.Item
      sign_inverse?: boolean
      sign_inverse_txt?: boolean
      // { file, func, ...args } used to compute the value via a global function.
      value_functor?: string[]
    }
    export const stats_table: Record<string, Record<string, StatDescriptor>>
    export function add_stats_table(k1: string, k2: string, v: StatDescriptor): void
    export function get_stats_func_value(obj: CGameObject, sec: Section.Item, file: string, func: string, ...args: unknown[]): number | undefined
    export function get_stats_string_value(obj: CGameObject, sec: Section.Item, gr: string | StatDescriptor, stat: string, to_text: boolean): LuaMultiReturn<[string | number, boolean]>
    export function get_stats_table(sec: Section.Item): Record<string, StatDescriptor> | undefined
    export function get_stats_value(obj: CGameObject, sec: Section.Item, gr: string | StatDescriptor, stat: string): number | false
    export function get_stats_xml(handler: CUIWindow, obj: CGameObject, sec: Section.Item, gr: string | StatDescriptor, stat: string): CUIStatic | undefined
    export function get_time(): number
    export function get_utils_xml(): CScriptXmlInit
    export function main_menu_off(): void
    export function main_menu_on(): void
    export function on_game_start(): void
    export function prepare_stats_table(): void
    export function prop_accuracry(obj: CGameObject, sec: Section.Item): number
    export function prop_condition(obj: CGameObject, sec: Section.Item): number
    export function prop_damage(obj: CGameObject, sec: Section.Item): number
    export function prop_handling(obj: CGameObject, sec: Section.Item): number
    export function prop_rpm(obj: CGameObject, sec: Section.Item): number
    export function set_item_order(): void
    export function sort_by_index(t: AnyTable, a: number, b: number): boolean
    export function sort_by_kind(t: AnyTable, a: number, b: number): boolean
    export function sort_by_props(t: AnyTable, a: number, b: number): boolean
    export function sort_by_size(t: AnyTable, a: number, b: number): boolean
    export function sort_by_sizekind(t: AnyTable, a: number, b: number): boolean
    export function sort_info(asec: string, bsec: string): void
  }

  /** @customConstructor UICellContainer */
  class UICellContainer {
    ID: TODO // @generated field — refine type
    can_select: boolean // @generated field — refine type
    cell: TODO // @generated field — refine type
    cell_vis_offset: number // @generated field — refine type
    col_end: TODO // @generated field — refine type
    cols: TODO // @generated field — refine type
    db: TODO // @generated field — refine type
    disable_bar: boolean // @generated field — refine type
    disable_callback: TODO // @generated field — refine type
    disable_drag: boolean // @generated field — refine type
    disable_highlight: boolean // @generated field — refine type
    disable_info: boolean // @generated field — refine type
    disable_scroll: TODO // @generated field — refine type
    disable_scroll_dragdrop: boolean // @generated field — refine type
    disable_stack: boolean // @generated field — refine type
    drag_area: TODO // @generated field — refine type
    drag_down: TODO // @generated field — refine type
    drag_up: TODO // @generated field — refine type
    grid: TODO // @generated field — refine type
    grid_line: TODO // @generated field — refine type
    grid_size: TODO // @generated field — refine type
    hold: TODO // @generated field — refine type
    hover: TODO // @generated field — refine type
    idxer: TODO // @generated field — refine type
    ignore_scroll: boolean // @generated field — refine type
    indx_id: TODO // @generated field — refine type
    indx_sec: TODO // @generated field — refine type
    line: TODO // @generated field — refine type
    line_cnt: number // @generated field — refine type
    manual: TODO // @generated field — refine type
    owner: TODO // @generated field — refine type
    pad: TODO // @generated field — refine type
    path: TODO // @generated field — refine type
    pd: TODO // @generated field — refine type
    prof: TODO // @generated field — refine type
    rKind: TODO // @generated field — refine type
    row_end: TODO // @generated field — refine type
    scolling_power: TODO // @generated field — refine type
    scolling_power_up: number // @generated field — refine type
    scroll: TODO // @generated field — refine type
    scroll_pause: boolean // @generated field — refine type
    scroll_pos: TODO // @generated field — refine type
    scroll_tg: TODO // @generated field — refine type
    selected: TODO // @generated field — refine type
    showcase: boolean // @generated field — refine type
    sort_method: string // @generated field — refine type
    st: TODO // @generated field — refine type
    stack_all: boolean // @generated field — refine type
    use_frame: TODO // @generated field — refine type
    xml: TODO // @generated field — refine type
    constructor(id: string, owner: CUIScriptWnd, path: string, prof: string, ele_base: CUIWindow, manual: boolean, use_frame: boolean)
    InitControls(owner: CUIScriptWnd, prof: string, ele_base: CUIWindow): void
    Reinit(t?: AnyTable, tf?: AnyTable): void
    AddIndex(id: number, sec: Section.Item | undefined, indx: number): void
    RemoveIndex(id: number, sec?: Section.Item, indx?: number): void
    GetCell_ID(id: number, only_indx?: boolean): number | UICellItem | undefined
    GetCell_SEC(sec: Section.Item): UICellItem | false
    GetCell_Selected(only_obj?: boolean): CGameObject | UICellItem | undefined
    GetCell_Focused(only_cell?: boolean): UICellItem | LuaMultiReturn<[string, number, CGameObject | undefined]> | undefined
    GetObj(idx: number): CGameObject | undefined
    GetID(obj: CGameObject | undefined, sec: Section.Item, create?: boolean): number | undefined
    AddItemInCell(obj: CGameObject | undefined, sec: Section.Item, indx: number, area?: { y: number; x: number; w: number; h: number }): boolean
    AddItem(obj?: CGameObject, sec?: Section.Item, info?: unknown): number | undefined
    AddItemManual(obj?: CGameObject, sec?: Section.Item, indx?: number): boolean | undefined
    RemoveItem(obj?: CGameObject, sec?: Section.Item): void
    RemoveItem_byID(id: number): void
    RemoveItemManual(indx: number): void
    TransferItem(cont_to: UICellContainer, obj?: CGameObject, sec?: Section.Item): UICellItem | undefined
    UpdateItem(obj?: CGameObject, sec?: Section.Item): void
    FindFreeCell(obj?: CGameObject, sec?: Section.Item): { y: number; x: number; w: number; h: number } | false
    IsFreeRoom(r: number, c: number, w: number, h: number): boolean
    TakeRoom(r: number, c: number, w: number, h: number): { y: number; x: number; w: number; h: number }
    FreeRoom(r: number, c: number, w: number, h: number): void
    FindSimilar(obj?: CGameObject, sec?: Section.Item): UICellItem | false
    Grow(): void
    IsTradable(obj: CGameObject): boolean | undefined
    GetCellCost(ci: UICellItem): number
    On_Select(idx?: number | false): void
    On_Drag(idx: number | false, tg: number, set?: boolean): void
    On_Hover(idx: number | false): void
    On_Mouse1(idx: number): void
    On_Mouse1_DB(idx: number): unknown
    On_Mouse2(idx: number): void
    On_Scroll(): void
    Update(item_info?: UIInfoItem, no_info?: boolean, hide?: boolean): boolean
    OnKeyboard(dik: number, keyboard_action: number): void
    Callback(func: string, ...args: unknown[]): unknown
    Reset(): void
    IsCellVisible(ci: UICellItem): boolean
    Scroll_Reinit(keep_pos?: boolean): void
    Scroll_SetPos(Y?: number, force?: boolean): void
    Scroll_GetHeight(num?: number, ele?: boolean): number
    Scroll_DragDrop_Ctrl(): boolean
    Scroll_Pad_Ctrl(update?: boolean): void
    GetSortMethod(): (this: void, t: AnyTable, a: number, b: number) => boolean
    AdjustWnd(x?: number, y?: number, w?: number, h?: number): void
    AdjustHeightToCell(): void
    AdjustWidthToCell(): void
    SetBackground(path: string, clr: number): void
    SetGridSpecs(size?: number, line?: number): void
    Show(state: boolean): void
    IsShown(): boolean
    EnableScrolling(state: boolean): void
    IsCursorOverWindow(): boolean
    Print(mark: string | undefined, fmt: string, ...args: unknown[]): void
  }

  /** @customConstructor UICellItem */
  class UICellItem {
    /** Running height of the list as rows are added, in UI units. */
    H: number
    /** Running width of the list, grown by `AddItemToList` to fit the widest row. */
    W: number
    area: TODO // @generated field — refine type
    bar: TODO // @generated field — refine type
    childs: TODO // @generated field — refine type
    cnt: TODO // @generated field — refine type
    ctxt: TODO // @generated field — refine type
    ctxts: TODO // @generated field — refine type
    ico_gl: TODO // @generated field — refine type
    ico_scope: TODO // @generated field — refine type
    ico_sil: TODO // @generated field — refine type
    layer: TODO // @generated field — refine type
    upgr: TODO // @generated field — refine type
    constructor(container: UICellContainer, st: CUIStatic | { path: string; base: CUIStatic }, indx: number, manual: boolean)

    // Instance fields set in __init/InitControls (utils_ui.script). The skeleton previously listed
    // only methods; these are the `self.*` data members the class actually carries.
    container: UICellContainer
    /** Container path this cell's xml nodes hang off of. */
    path: string
    indx: number
    /** `manual` placement disables some behaviour; `false` for object-attached cells. */
    manual: boolean
    /** `[0]` attached to object / `[1]` attached to section (showcase) / `[2]` showcase, no room adjust. */
    showcase: number
    /** Cell xml node name: `"cell"`, or `"cell_<indx>"` in manual placement. */
    cx: string
    grid_size: number
    grid_line: number
    /** Free-form table for custom per-cell info. */
    flags: AnyTable
    disable_bar: boolean
    /** Highlight static (`:highlight`). */
    hl: CUIStatic
    /** Main cell static. */
    cell: CUIStatic
    /** Shadow static (`:pic` over `cell`). */
    shadow: CUIStatic
    /** Icon static (`:pic`). */
    ico: CUIStatic
    /** Set for free cells built from a `{ path, base }` descriptor. */
    st?: CUIStatic
    /** Game-object id once the cell is bound to an object; `undefined` for showcase cells. */
    ID?: number
    /** Section of the bound object/showcase; `undefined` when reset. */
    section?: string
    InitControls(path: string, st: CUIStatic | { path: string; base: CUIStatic }): void
    // `obj` is a game object, or its section string for showcase cells.
    Set(obj: CGameObject | string, area?: { x: number; y: number; w: number; h: number }): boolean
    Update(obj?: CGameObject): boolean
    Add_Icon(sec: Section.Item, w: number, h: number): void
    Add_Shadow(sec: Section.Item, w: number, h: number): void
    Add_Layers(xml: CScriptXmlInit, obj: CGameObject, sec: Section.Item, clsid: number): void
    Add_ProgressBar(xml: CScriptXmlInit, obj: CGameObject, sec: Section.Item, clsid: number): void
    Add_Counter(xml: CScriptXmlInit, obj: CGameObject, sec: Section.Item): void
    Add_Upgrade(xml: CScriptXmlInit, obj: CGameObject, sec: Section.Item): void
    Add_Attachements(xml: CScriptXmlInit, obj: CGameObject, sec: Section.Item, clsid: number): void
    Add_CustomText(txt: string, align_h?: number, align_v?: number, clr?: number, fnt?: string): void
    Create_Layer(ele: CUIStatic, base: CUIStatic, sec_m: string, sec_l: string, str_x?: string, str_y?: string, str_scale?: string): void
    Colorize(clr_id: string): void
    Highlight(state: boolean, clr_id?: string, main_clr?: boolean): void
    Check_TradeMode(obj: CGameObject, sec: Section.Item): boolean
    GetCost(): void
    AddChild(obj: CGameObject): boolean
    PopChild(obj?: CGameObject, id?: number): void
    HasChild(obj?: CGameObject, id?: number): number | boolean | undefined
    CountChilds(): number
    ResetToChild(): boolean
    Reset(): void
    Show(state: boolean, obj?: CGameObject): void
    IsShown(): boolean
    IsCursorOverWindow(): boolean
    GetXML(): CScriptXmlInit
    Print(mark: string | undefined, fmt: string, ...args: unknown[]): void
  }

  /**
   * The arguments a context menu entry's callback is invoked with: the id of the item the
   * menu was opened on, the container it sits in, and whatever extra values the property's
   * `action` tuple carried (its own method name included — vanilla ignores it).
   */
  type CellPropertyParams = [id: number, bag: string, ...args: unknown[]]

  /** @customConstructor UICellProperties */
  class UICellProperties extends CUIScriptWnd {
    /** Running height of the list as rows are added, in UI units. */
    H: number
    H_L: number // @generated field — refine type
    PDH: number // @generated field — refine type
    PDW: number // @generated field — refine type
    /** Running width of the list, grown by `AddItemToList` to fit the widest row. */
    W: number
    W_L: number // @generated field — refine type
    /** Game time an action was taken, or `false` before any; used to swallow the click. */
    action_moment: number | false
    /** Row text size read from `properties:file_item:fn` in xml. */
    file_item_fn_sz: vector2
    /** Row size read from `properties:file_item:main` in xml. */
    file_item_main_sz: vector2
    /** Background static the frame, list and highlight are attached to. */
    form: CUIStatic
    frame: CUIFrameWindow
    /** Hover strip moved over the row under the cursor by `Update`. */
    highlight: CUIStatic
    list_box: CUIListBox
    /** The window whose method an entry's `func` names — the inventory screen in practice. */
    owner: CUIScriptWnd
    constructor(owner: CUIScriptWnd)
    __finalize(): void
    InitControls(): void
    Update(): void
    Reset(
      pos_override: vector2 | undefined,
      action_list: string[],
      name_list: string[],
      params_list: CellPropertyParams[],
    ): void
    FillList(action_list: string[], name_list: string[], params_list: CellPropertyParams[]): void
    OnListItemClicked(): void
    OnListItemDbClicked(): void
    InitCallBacks(): void
    AddItemToList(index: number, str_id: string, func: string, params?: CellPropertyParams): void
    OnKeyboard(dik: number, keyboard_action: number): boolean
    OnHide(): void
  }

  /** @customConstructor UICellProperties_item */
  class UICellProperties_item extends CUIListBoxItem {
    /** The row's text field, i.e. the `GetTextItem()` the constructor caches. */
    textControl: CUITextWnd
    constructor()
    __finalize(): void
  }

  /** @customConstructor UIHint */
  class UIHint {
    delay: TODO // @generated field — refine type
    dialog: TODO // @generated field — refine type
    dialog_text: TODO // @generated field — refine type
    owner: TODO // @generated field — refine type
    path: TODO // @generated field — refine type
    timer: TODO // @generated field — refine type
    txt: TODO // @generated field — refine type
    constructor(owner: CUIScriptWnd, delay?: number, path?: string)
    InitControls(): void
    Update(txt: string): void
    Pass(txt: string): boolean
    Show(state: boolean): void
  }

  /** @customConstructor UIInfoItem */
  class UIInfoItem {
    ammo: TODO // @generated field — refine type
    ammo_cap: TODO // @generated field — refine type
    ammo_ico: TODO // @generated field — refine type
    ammo_ico_temp: TODO // @generated field — refine type
    ammo_parse: TODO // @generated field — refine type
    ammo_txt: TODO // @generated field — refine type
    can_compare: boolean // @generated field — refine type
    delay: TODO // @generated field — refine type
    desc: TODO // @generated field — refine type
    dialog: TODO // @generated field — refine type
    frame: CUIFrameWindow
    id: TODO // @generated field — refine type
    name: TODO // @generated field — refine type
    note: TODO // @generated field — refine type
    owner: TODO // @generated field — refine type
    section: TODO // @generated field — refine type
    stats: TODO // @generated field — refine type
    stats_dialog: TODO // @generated field — refine type
    timer: TODO // @generated field — refine type
    value: TODO // @generated field — refine type
    weight: TODO // @generated field — refine type
    constructor(owner: CUIScriptWnd, delay?: number)
    InitControls(): void
    Update(obj?: CGameObject, sec?: Section.Item, flags?: AnyTable): void
    Pass(obj?: CGameObject, sec?: Section.Item): boolean
    GetType(sec: Section.Item): string
    GetUpgrades(obj?: CGameObject): unknown
    Sync_Finale(cond: boolean, ele_syncer: CUIWindow | undefined, ele_resizer: CUIWindow, ele_adapter: CUIWindow, offset: number): boolean
    Sync_Y(parent: CUIWindow | undefined, child: CUIWindow, offset?: number): number
    Sync_H(parent: CUIWindow, child: CUIWindow, offset: number): number
    Reset_Y(ele: CUIWindow): void
    Reset(): void
    IsShown(): boolean
    Show(state: boolean): void
  }

  /** @customConstructor UIInfoUpgr */
  class UIInfoUpgr {
    cost: TODO // @generated field — refine type
    delay: TODO // @generated field — refine type
    desc: TODO // @generated field — refine type
    dialog: TODO // @generated field — refine type
    frame: CUIFrameWindow
    name: TODO // @generated field — refine type
    owner: TODO // @generated field — refine type
    prereq: TODO // @generated field — refine type
    prop: TODO // @generated field — refine type
    prop_frame: TODO // @generated field — refine type
    prop_h: TODO // @generated field — refine type
    section: TODO // @generated field — refine type
    timer: TODO // @generated field — refine type
    constructor(owner: CUIScriptWnd, delay?: number)
    InitControls(): void
    Update(upgr: string, prereq: string, installed: boolean): void
    Pass(sec: Section.Item): boolean
    ExtractFunctor(sec: Section.Item, param: string, ...args: unknown[]): unknown
    Sync_Y(parent: CUIWindow | undefined, child: CUIWindow, offset?: number): number
    Sync_H(parent: CUIWindow, child: CUIWindow, offset: number): number
    Reset(): void
    IsShown(): boolean
    Show(state: boolean): void
  }

  namespace utils_ui {
    /** Anomaly `class "UICellContainer"` is also reachable on the `utils_ui` script namespace; typed as
     *  the instance so its methods can be captured/overridden (`utils_ui.UICellContainer.Method = ...`). */
    export const UICellContainer: UICellContainer
    /** Anomaly `class "UICellItem"` is also reachable on the `utils_ui` script namespace; typed as
     *  the instance so its methods can be captured/overridden (`utils_ui.UICellItem.Method = ...`). */
    export const UICellItem: UICellItem
    /** Anomaly `class "UICellProperties"` is also reachable on the `utils_ui` script namespace; typed as
     *  the instance so its methods can be captured/overridden (`utils_ui.UICellProperties.Method = ...`). */
    export const UICellProperties: UICellProperties
    /** Anomaly `class "UICellProperties_item"` is also reachable on the `utils_ui` script namespace; typed as
     *  the instance so its methods can be captured/overridden (`utils_ui.UICellProperties_item.Method = ...`). */
    export const UICellProperties_item: UICellProperties_item
    /** Anomaly `class "UIHint"` is also reachable on the `utils_ui` script namespace; typed as
     *  the instance so its methods can be captured/overridden (`utils_ui.UIHint.Method = ...`). */
    export const UIHint: UIHint
    /** Anomaly `class "UIInfoItem"` is also reachable on the `utils_ui` script namespace; typed as
     *  the instance so its methods can be captured/overridden (`utils_ui.UIInfoItem.Method = ...`). */
    export const UIInfoItem: UIInfoItem
    /** Anomaly `class "UIInfoUpgr"` is also reachable on the `utils_ui` script namespace; typed as
     *  the instance so its methods can be captured/overridden (`utils_ui.UIInfoUpgr.Method = ...`). */
    export const UIInfoUpgr: UIInfoUpgr
  }
}
