import js from "@eslint/js";
import globals from "globals";

export default [
    js.configs.recommended,

    {
        // Global ignores
        ignores: [
            "**/*.min.js",
            "**/src/lib/**",
            "**/dist/",
            "src/backend/src/public/assets/**",
            "incubator/**"
        ],
    },
    {
        // Top-level and tools use Node
        files: [
            "tools/**/*.js",
        ],
        languageOptions: {
            globals: {
                ...globals.node,
            }
        }
    },
    {
        // Back end
        files: [
            "src/backend/**/*.js",
            "mods/**/*.js",
            "dev-server.js",
            "utils.js",
        ],
        languageOptions: {
            globals: {
                ...globals.node,
                "kv": true,
                "def": true,
                "use": true,
                "ll":true,
            }
        }
    },
    {
        // Front end
        files: [
            "src/**/*.js",
        ],
        ignores: [
            "src/backend/**/*.js",
        ],
        languageOptions: {
            globals: {
                ...globals.browser,
                ...globals.commonjs,
                // Weird false positives
                "Buffer": true,
                // Puter Common
                "puter": true,
                "i18n": true,
                "html_encode": true,
                "html_decode": true,
                "isMobile": true,
                // Class Registry
                "logger": true,
                "def": true,
                "use": true,
                // Libraries
                "saveAs": true,         // FileSaver
                "iro": true,            // iro.js color picker
                "$": true,              // jQuery
                "jQuery": true,         // jQuery
                "JSZip": true,          // JSZip
                "_": true,              // lodash
                "QRCode": true,         // qrcode
                "io": true,             // socket.io
                "timeago": true,        // timeago
                "SelectionArea": true,  // viselect
                // Puter GUI Globals
                "set_menu_item_prop": true,
                "determine_active_container_parent": true,
                "privacy_aware_path": true,
                "api_origin": true,
                "auth_token": true,
                "logout": true,
                "is_email": true,
                "select_ctxmenu_item": true,
            }
        }
    },
    {
        // Mods
        // NOTE: Mods have backend and frontend parts, so this just includes the globals for both.
        files: [
            "mods/**/*.js",
        ],
        languageOptions: {
            globals: {
                ...globals.node,
                "use": true,
                "window": true,
                "puter": true,
            }
        }
    },
    {
        // Tests
        files: [
            "**/test/**/*.js",
        ],
        languageOptions: {
            globals: {
                ...globals.mocha,
            }
        }
    },
    {
        // Phoenix
        files: [
            "src/phoenix/**/*.js",
        ],
        languageOptions: {
            globals: {
                ...globals.node,
            }
        }
    },
    {
        // Global rule settings
        rules: {
            "no-prototype-builtins": "off", // Complains about any use of hasOwnProperty()
            "no-unused-vars": "off", // Temporary, we just have a lot of these
            "no-debugger": "warn",
            "no-async-promise-executor": "off",  // We do this quite often and it's fine
        }
    },
];
