local npcs = list.Get("NPC")
local citizenEnemy = npcs["npc_citizen_rebel_enemy"]
local originalListSet = list.Set

local function loadNPCBlacklist()
    local json = file.Read("npc_blacklist.json", "DATA")
    print(json)
    if not json or json == "" then return {} end
    local data = util.JSONToTable(json)
    return istable(data) and data or {}
end

function list.Set(listType, class, npc)
    if listType == "NPC" then
        if npc["Class"] == "npc_combine_s" and npc["Category"] ~= "#spawnmenu.category.combine" then
            npc["Class"] = citizenEnemy["Class"]
            npc["KeyValues"] = {
                Hostile = 1,
                SquadName =	"overwatch",
                citizentype = 4
            }
        end
    end
    originalListSet(listType, class, npc)
end

CreateClientConVar("replacehostile_blacklist", "", false, false, "Blacklist NPC Classes")

hook.Add("PopulateToolMenu", "ReplaceHostileMenu", function()
    local blacklist = loadNPCBlacklist()
    local defaultBlacklistStr = table.concat(blacklist, ",")

    RunConsoleCommand("replacehostile_blacklist", defaultBlacklistStr)

    spawnmenu.AddToolMenuOption("Options", "Replace Hostile", "ReplaceHostileConfig", "Settings", "", "", function(panel)
        panel:ClearControls()
        
        local blacklistEntry = panel:TextEntry("Blacklist Classes", "replacehostile_blacklist")

        panel:ControlHelp("Separate classes with commas.\nExample: npc_my_custom_hostile,npc_my_hostile,npc_hostile_test")

        blacklistEntry.OnChange = function(self)
            local val = self:GetValue() or ""
            local newBlacklist = {}

            for e in string.gmatch(val, '([^,]+)') do
                local trimmed = string.Trim(e)
                if trimmed ~= "" then
                    table.insert(newBlacklist, trimmed)
                end
            end

            local valid = true
            for _, v in ipairs(newBlacklist) do
                if type(v) ~= "string" or v == "" then
                    valid = false
                    break
                end
            end
            
            if valid then
                file.Write("npc_blacklist.json", util.TableToJSON(newBlacklist, false))
            end
        end
        
        panel:Help("NOTE: Restart the map to apply the changes.")
    end)
end)

-- Second stage. idk if one of these necessary
timer.Simple(0, function ()
    for class, npc in pairs(npcs) do
        if npc["Class"] == "npc_combine_s" and npc["Category"] ~= "#spawnmenu.category.combine" then
            npc["Class"] = citizenEnemy["Class"]
            npc["KeyValues"] = {
                Hostile = 1,
                SquadName =	"overwatch",
                citizentype = 4
            }
            originalListSet("NPC", class, npc)
        end
    end
end)