/** @noSelfInFile */

import type { Section } from 'anomaly-packer'

declare global {
  namespace utils_data {
    export function angle_diff(a1: vector, a2: vector): number
    export function angle_left(dir1: vector, dir2: vector): boolean
    export function angle_left_xz(dir1: vector, dir2: vector): boolean
    export function cfg_get_string(char_ini: system_ini, section: Section.Item, field: string, object: CGameObject, mandatory: boolean, gulag_name?: string, default_val?: string): string | undefined
    /** Collects a section's lines: by default an array of line ids; with `keytable`, a `{ id: value }` map (`true` for empty values). */
    export function collect_section<KT extends boolean = false>(ini: system_ini, section: Section.Item, keytable?: KT): KT extends true ? Record<string, string | true> : string[]
    export function collect_sections(ini: system_ini, sections: string[]): LuaMultiReturn<[AnyTable, AnyTable]>
    export function collect_translations(st: string, is_translated?: boolean): string[] | false
    export function CTime_from_table(t: AnyTable): Time
    export function CTime_to_table(ct: Time): { Y: number; M: number; D: number; h: number; m: number; s: number; ms: number }
    export function CTime2table(gt: Time): AnyTable
    export function CTimeAddSec(ct: Time, sec: number): number
    export function CTimeToSec(ct: Time): number
    export function debug_write(output: string, trace?: boolean): void
    export function deg2rad(d: number): number
    export function file_to_table(fname: string, parent?: AnyTable, simple?: boolean): AnyTable
    export function findfunction(x: string, tbl: AnyTable): any
    export function float2hex(n: number): number
    export function fsgame_append(str: string, ap: string): void
    export function fspath(str: string): string
    export function get_comment(str: string): string
    export function get_ext(s: string): string
    export function get_fsgame(): AnyTable
    export function get_path(str: string, sep?: string): string | undefined
    export function get_scheme_by_section(section: Section.Item): string | undefined
    export function hex2string(str: string): string
    export function mean_random(index_min: number, index_max: number, mean_index?: number, left_power?: number, right_power?: number, flag?: boolean): number | undefined
    export function no_need_to_rotate(npc: CGameObject, target_pos: vector): boolean
    export function no_need_to_rotate_xz(npc: CGameObject, target_pos: vector): boolean
    export function on_game_start(): void
    export function pairsByKeys(t: AnyTable, f?: (a: any, b: any) => boolean): any
    export function parse_condlist(src: string): AnyTable
    export function parse_data(npc: CGameObject, s?: string): AnyTable
    export function parse_data_1v(npc: CGameObject, s?: string): AnyTable
    export function parse_ini_section_to_array(ini: system_ini, section: Section.Item): AnyTable
    export function parse_ini_section_to_bool_array(ini: system_ini, section: Section.Item): Record<string, boolean>
    export function parse_list_ex(ini: system_ini, key: string, val: string, convert?: boolean): AnyTable
    export function parse_params(params: string): string[]
    export function parse_string_keys(str: string, tbl: AnyTable, key?: string): string
    export function parse_syn_data(npc: CGameObject, s?: string): AnyTable
    export function pos_in_rect(p: vector, r: AnyTable): boolean
    export function prefix_r_string(ini: system_ini, sec: Section.Item, key: string, prefix?: string): string | undefined
    export function print_dbg(...args: any[]): void
    export function print_packet_data(data: net_packet): void
    export function print_table(node: AnyTable, header?: string, format_only?: boolean): string | void
    export function r_CTime(p: net_packet, caller?: string): Time | undefined
    export function rad2deg(r: number): number
    export function read_from_ini(ini: system_ini, section: Section.Item, line: string, var_type: 'bool' | 'string' | 'float' | string, _default?: any, caller?: string): any
    export function startsWith(text: string, prefix: string): boolean
    export function string_to_vector(str: string): vector
    export function string2hex(str: string): string
    export function table2CTime(t: AnyTable): Time | undefined
    export function to_str(what: any): string
    export function trim_comment(str: string): string
    export function vector_cmp(a: vector, b: vector): boolean
    export function vector_cmp_prec(a: vector, b: vector, d: number): boolean
    export function vector_to_string(vec: vector): string
    export function w_CTime(p: net_packet, t?: Time, caller?: string): void
    export function w_stpk(stpk: net_packet, typ: string, n: any, info: InfoPortion): void
  }
  
  /** @customConstructor cfg_file */
  class cfg_file {
    directory: TODO // @generated field — refine type
    fname: TODO // @generated field — refine type
    insert: TODO // @generated field — refine type
    root: TODO // @generated field — refine type
    constructor(fname: string, simple_mode?: boolean)
    GetValue(sec: Section.Item, key: string, typ?: number | string, def?: any): any
    GetKeys(sec: Section.Item): string[]
    SetValue(sec: Section.Item, key: string, val: any): void
    ClearValue(sec: Section.Item, key: string): void
    SectionExist(sec: Section.Item): boolean
    KeyExist(sec: Section.Item, key: string): boolean
    SaveExt(): void
    Save(): void
  }

  namespace utils_data {
    /** Anomaly `class "cfg_file"` is also reachable on the `utils_data` script namespace; typed as
     *  the instance so its methods can be captured/overridden (`utils_data.cfg_file.Method = ...`). */
    export const cfg_file: cfg_file
  }
}
