/*
 * Vencord, a Discord client mod
 * Copyright (c) 2024 Vendicated and contributors
 * SPDX-License-Identifier: GPL-3.0-or-later
 */

import { definePluginSettings } from "@api/Settings";
import { Devs } from "@utils/constants";
import definePlugin, { OptionType } from "@utils/types";

const Noop = () => { };
const NoopLogger = {
    logDangerously: Noop,
    log: Noop,
    verboseDangerously: Noop,
    verbose: Noop,
    info: Noop,
    warn: Noop,
    error: Noop,
    trace: Noop,
    time: Noop,
    fileOnly: Noop
};

const settings = definePluginSettings({
    disableNoisyLoggers: {
        type: OptionType.BOOLEAN,
        description: "Disable noisy loggers like the MessageActionCreators",
        default: false,
        restartNeeded: true
    },
    disableSpotifyLogger: {
        type: OptionType.BOOLEAN,
        description: "Disable the Spotify logger, which leaks account information and access token",
        default: true,
        restartNeeded: true
    }
});

export default definePlugin({
    name: "ConsoleJanitor",
    description: "Disables annoying console messages/errors",
    authors: [Devs.Nuckyz],
    settings,

    NoopLogger: () => NoopLogger,

    patches: [
        {
            find: 'console.warn("Window state not initialized"',
            replacement: {
                match: /console\.warn\("Window state not initialized",\i\),/,
                replace: ""
            }
        },
        {
            find: "is not a valid locale.",
            replacement: {
                match: /\i\.error\(""\.concat\(\i," is not a valid locale."\)\);/,
                replace: ""
            }
        },
        {
            find: "notosans-400-normalitalic",
            replacement: {
                match: /,"notosans-.+?"/g,
                replace: ""
            }
        },
        {
            find: 'console.warn("[DEPRECATED] Please use `subscribeWithSelector` middleware");',
            all: true,
            replacement: {
                match: /console\.warn\("\[DEPRECATED\] Please use `subscribeWithSelector` middleware"\);/,
                replace: ""
            }
        },
        {
            find: "RPCServer:WSS",
            replacement: {
                match: /\i\.error\("Error: "\.concat\((\i)\.message/,
                replace: '!$1.message.includes("EADDRINUSE")&&$&'
            }
        },
        {
            find: "Tried getting Dispatch instance before instantiated",
            replacement: {
                match: /null==\i&&\i\.warn\("Tried getting Dispatch instance before instantiated"\),/,
                replace: ""
            }
        },
        {
            find: "Unable to determine render window for element",
            replacement: {
                match: /console\.warn\("Unable to determine render window for element",\i\),/,
                replace: ""
            }
        },
        {
            find: "failed to send analytics events",
            replacement: {
                match: /console\.error\("\[analytics\] failed to send analytics events query: "\.concat\(\i\)\)/,
                replace: ""
            }
        },
        {
            find: "ProductCatalog",
            replacement: {
                match: /\i\.warn\("Cannot find the corresponding SKU to the user's premium type "\.concat\(\i\.premiumType\)\),/,
                replace: ""
            }
        },
        {
            find: "Slow dispatch on",
            replacement: {
                match: /\i\.totalTime>100&&\i\.verbose\("Slow dispatch on ".+?\)\);/,
                replace: ""
            }
        },
        ...[
            '("MessageActionCreators")', '("ChannelMessages")',
            '("Routing/Utils")', '("RTCControlSocket")',
            '("ConnectionEventFramerateReducer")', '("RTCLatencyTestManager")',
            '("OverlayBridgeStore")', '("RPCServer:WSS")', '("RPCServer:IPC")'
        ].map(logger => ({
            find: logger,
            predicate: () => settings.store.disableNoisyLoggers,
            all: true,
            replacement: {
                match: new RegExp(String.raw`new \i\.\i${logger.replace(/([()])/g, "\\$1")}`),
                replace: `$self.NoopLogger${logger}`
            }
        })),
        {
            find: '"Experimental codecs: "',
            predicate: () => settings.store.disableNoisyLoggers,
            replacement: {
                match: /new \i\.\i\("Connection\("\.concat\(\i,"\)"\)\)/,
                replace: "$self.NoopLogger()"
            }
        },
        {
            find: '"Handling ping: "',
            predicate: () => settings.store.disableNoisyLoggers,
            replacement: {
                match: /new \i\.\i\("RTCConnection\("\.concat.+?\)\)(?=,)/,
                replace: "$self.NoopLogger()"
            }
        },
        {
            find: '("Spotify")',
            predicate: () => settings.store.disableSpotifyLogger,
            replacement: {
                match: /new \i\.\i\("Spotify"\)/,
                replace: "$self.NoopLogger()"
            }
        }
    ]
});
