import pluginJs from "@eslint/js";
import tseslintPlugin from "@typescript-eslint/eslint-plugin";
import tsParser from "@typescript-eslint/parser";
import prettier from "eslint-plugin-prettier";
import promisePlugin from "eslint-plugin-promise";
import simpleImportSort from "eslint-plugin-simple-import-sort";
import unicorn from "eslint-plugin-unicorn";
import unusedImports from "eslint-plugin-unused-imports";
import globals from "globals";

/** @type {import('eslint').Linter.FlatConfig[]} */
export default [
	{
		files: ["**/*.{js,mjs,cjs}"],
		languageOptions: {
			globals: globals.node,
		},
		...pluginJs.configs.recommended,
		plugins: {
			"simple-import-sort": simpleImportSort,
			"unused-imports": unusedImports,
			promise: promisePlugin,
			prettier: prettier,
			unicorn: unicorn,
		},
		rules: {
			"eol-last": ["error", "always"],
			"no-multiple-empty-lines": ["error", { max: 1, maxEOF: 1 }],
			"no-mixed-spaces-and-tabs": ["error", "smart-tabs"],
			"simple-import-sort/imports": "error",
			"simple-import-sort/exports": "error",
			"unused-imports/no-unused-imports": "error",
			"unused-imports/no-unused-vars": [
				"warn",
				{
					vars: "all",
					varsIgnorePattern: "^_",
					args: "after-used",
					argsIgnorePattern: "^_",
				},
			],
			"promise/always-return": "error",
			"promise/no-return-wrap": "error",
			"promise/param-names": "error",
			"promise/catch-or-return": "error",
			"promise/no-nesting": "warn",
			"promise/no-promise-in-callback": "warn",
			"promise/no-callback-in-promise": "warn",
			"prettier/prettier": [
				"error",
				{
					useTabs: true,
					tabWidth: 4,
				},
			],
			indent: ["error", "tab", { SwitchCase: 1 }],
			"unicorn/filename-case": [
				"error",
				{
					case: "camelCase",
				},
			],
		},
	},
	{
		files: ["**/*.{ts,tsx}"],
		languageOptions: {
			parser: tsParser,
			globals: globals.node,
		},
		plugins: {
			"@typescript-eslint": tseslintPlugin,
			"simple-import-sort": simpleImportSort,
			"unused-imports": unusedImports,
			promise: promisePlugin,
			prettier: prettier,
			unicorn: unicorn,
		},
		rules: {
			...tseslintPlugin.configs.recommended.rules,
			quotes: ["error", "double"],
			"eol-last": ["error", "always"],
			"no-multiple-empty-lines": ["error", { max: 1, maxEOF: 1 }],
			"no-mixed-spaces-and-tabs": ["error", "smart-tabs"],
			"simple-import-sort/imports": "error",
			"simple-import-sort/exports": "error",
			"unused-imports/no-unused-imports": "error",
			"unused-imports/no-unused-vars": [
				"warn",
				{
					vars: "all",
					varsIgnorePattern: "^_",
					args: "after-used",
					argsIgnorePattern: "^_",
				},
			],
			"promise/always-return": "error",
			"promise/no-return-wrap": "error",
			"promise/param-names": "error",
			"promise/catch-or-return": "error",
			"promise/no-nesting": "warn",
			"promise/no-promise-in-callback": "warn",
			"promise/no-callback-in-promise": "warn",
			"prettier/prettier": [
				"error",
				{
					useTabs: true,
					tabWidth: 4,
				},
			],
			indent: ["error", "tab", { SwitchCase: 1 }],
			"unicorn/filename-case": [
				"error",
				{
					case: "camelCase",
				},
			],
			"@typescript-eslint/explicit-function-return-type": ["error"],
			"@typescript-eslint/explicit-module-boundary-types": ["error"],
			"@typescript-eslint/typedef": [
				"error",
				{
					arrowParameter: true,
					variableDeclaration: true,
					propertyDeclaration: true,
					memberVariableDeclaration: true,
					parameter: true,
				},
			],
		},
	},
];