---==================================================================================================================---
---                                                                                                                  ---
---    Original Author(s) : NLTP_ASHES                                                                               ---
---    Edited : N/A                                                                                                  ---
---    Date : 12/11/2023                                                                                             ---
---    License : Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)           ---
---                                                                                                                  ---
---    Script used to add a new valid node to the dialog system.                                                     ---
---                                                                                                                  ---
---    With this script, you can define a node like :                                                                ---
---    st_something_                                                                          ---
---                                                                                                                  ---
---    And then, you can define a couple of translation strings like :                                               ---
---     - st_something_0                                                                                             ---
---     - st_something_1                                                                                             ---
---     - st_something_2                                                                                             ---
---                                                                                                                  ---
---    At runtime, thanks to DXML, this script make it so it uses one of the 3 translation strings at random.        ---
---                                                                                                                  ---
---==================================================================================================================---
-- ---------------------------------------------------------------------------------------------------------------------
-- Core Functions
-- ---------------------------------------------------------------------------------------------------------------------
function on_xml_read()
    RegisterScriptCallback("on_xml_read", function(xml_file_name, xml_obj)
        -- Only execute on gamedata\configs\gameplay\*.xml
        if not string.find(xml_file_name, [[gameplay\]]) then
            return
        end
        -- Query the file to get the node(s) to modify
        local query_res = xml_obj:query("rand_text")
        -- Return if no results were found
        if is_empty(query_res) then
            return
        end
        -- Replace rand_text with script_text
        for _,elem in pairs(query_res) do
            local value = xml_obj:getText(elem)
            local phrase_elem = elem.parent
            local new_value = [[modxml_zzz_rand_text_dialog.]]..value..[[]]
            xml_obj:removeElement(elem)
            xml_obj:insertFromXMLString(new_value, phrase_elem, #phrase_elem.kids)
            this[value] = function()
                local translations = this.collect_translations(value, true)
                return translations and translations[math.random(#translations)] or "No translation"
            end
        end
    end)
end
function trigger_dxml()
    local file_list = str_explode(ini_sys:r_string("dialogs", "files"),",")
    local xml = CScriptXmlInit()
    for _,file_name in pairs(file_list) do
        xml:ParseDirFile([[gameplay]],file_name..".xml")
    end
    xml = nil
end
-- ---------------------------------------------------------------------------------------------------------------------
-- Callbacks registration
-- ---------------------------------------------------------------------------------------------------------------------
--- Function used to register callbacks.
--- @return nil
function on_game_start()
    RegisterScriptCallback("on_game_load", trigger_dxml)
end
-- ---------------------------------------------------------------------------------------------------------------------
-- Utils Functions
-- ---------------------------------------------------------------------------------------------------------------------
local cache_translated = {}
local cache_untranslated = {}
--- Function used to collect all translation string with the pattern of 'st'.
--- If is_translated is true, the table return will contained already translated strings.
--- @author unknown (from S.T.A.L.K.E.R. Anomaly's files)
--- @param st string
--- @param is_translated boolean
--- @return table
function collect_translations(st, is_translated)
    -- read strings with specific pattern (ends with increased number) -> return them translated in a table
    -- no need to scan for identical results
    if is_translated and cache_translated[st] then
        return cache_translated[st]
    elseif cache_untranslated[st] then
        return cache_untranslated[st]
    end
    local string_count = 1
    local tr_t = {}
    while true do
        local tr_s = game.translate_string(st .. string_count)
        if (tr_s == st .. string_count) then
            break
        else
            if is_translated then
                tr_t[#tr_t + 1] = tr_s
            else
                tr_t[#tr_t + 1] = st .. tostring(string_count)
            end
        end
        string_count = string_count + 1
    end
    if (#tr_t == 0) then
        if (not string.find(st,"st_msg")) then
            printf("~[WG] WARNING | Random Text Tag | collect_translations - strings of (%s) don't exist!", st)
        end
        return false
    end
    if is_translated then
        cache_translated[st] = tr_t
    else
        cache_untranslated[st] = tr_t
    end
    return tr_t
end