import { fixupConfigRules, fixupPluginRules } from "@eslint/compat";
import typescriptEslint from "@typescript-eslint/eslint-plugin";
import react from "eslint-plugin-react";
import reactHooks from "eslint-plugin-react-hooks";
import prettier from "eslint-plugin-prettier";
import promise from "eslint-plugin-promise";
import jestDom from "eslint-plugin-jest-dom";
import testingLibrary from "eslint-plugin-testing-library";
import globals from "globals";
import tsParser from "@typescript-eslint/parser";
import path from "node:path";
import { fileURLToPath } from "node:url";
import js from "@eslint/js";
import { FlatCompat } from "@eslint/eslintrc";

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const compat = new FlatCompat({
    baseDirectory: __dirname,
    recommendedConfig: js.configs.recommended,
    allConfig: js.configs.all
});

export default [{
    ignores: [
        "**/node_modules",
        "**/lib",
        "**/dist",
        "**/build",
        "**/coverage",
        "**/expected",
        "**/website",
        "**/gh-pages",
        "**/weex",
        "**/build.ts",
        "packages/vue",
        "packages/element",
        "**/esm",
        "**/doc-site",
        "**/public",
        "packages/*/*/client.d.ts",
        "packages/*/*/server.d.ts",
        "packages/*/*/client.js",
        "packages/*/*/server.js",
        "packages/core/build",
        "packages/core/devtools",
        "packages/core/database/src/sql-parser/index.js",
        "**/.dumi/tmp",
        "**/.dumi/tmp-test",
        "**/.dumi/tmp-production",
        "packages/core/cli/templates/plugin/src/client/*.tpl",
        "packages/app/client/src/.plugins",
        "**/docker",
        "**/storage",
        "**/benchmark",
        "packages/core/cli/src",
        "packages/core/cli/bin",
        "packages/plugins/@hera/plugin-core/src/client/features/departments/index.tsx",
    ],
}, ...fixupConfigRules(compat.extends(
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:react/recommended",
    "plugin:react-hooks/recommended",
    "plugin:promise/recommended",
    "plugin:prettier/recommended",
)), {
    plugins: {
        "@typescript-eslint": fixupPluginRules(typescriptEslint),
        react: fixupPluginRules(react),
        "react-hooks": fixupPluginRules(reactHooks),
        prettier: fixupPluginRules(prettier),
        promise: fixupPluginRules(promise),
        "jest-dom": jestDom,
        "testing-library": testingLibrary,
    },

    languageOptions: {
        globals: {
            ...globals.node,
            ...globals.es2020,
            ...globals.browser,
            sleep: true,
            prettyFormat: true,
        },

        parser: tsParser,
        ecmaVersion: 11,
        sourceType: "module",

        parserOptions: {
            ecmaFeatures: {
                jsx: true,
            },

            project: "./tsconfig.json",
        },
    },

    settings: {
        react: {
            version: "detect",
        },
    },

    rules: {
        "@typescript-eslint/no-this-alias": "off",
        "@typescript-eslint/ban-types": "off",
        "no-unused-vars": "off",
        "no-useless-catch": "off",
        "@typescript-eslint/no-unused-vars": "off",
        "no-empty-function": "off",
        "@typescript-eslint/no-empty-function": "off",
        "react/display-name": "off",
        "react/prop-types": "off",
        "no-explicit-any": "off",
        "@typescript-eslint/no-explicit-any": "off",
        "@typescript-eslint/ban-ts-comment": "off",
        "@typescript-eslint/no-var-requires": "off",
        "promise/always-return": "off",
    },
}, {
    files: ["**/e2e/**/*.{ts,js,tsx,jsx}", "**/__e2e__/**/*.{ts,js,tsx,jsx}"],

    rules: {
        "@typescript-eslint/no-floating-promises": "error",
    },
}, {
    files: [
        "packages/plugins/@hera/**/*.{ts,js,tsx,jsx}",
        "packages/plugins/@hera/**/*.{ts,js,tsx,jsx}",
    ],

    rules: {
        eqeqeq: ["error", "smart"],
    },
}];
