const env = {
  "browser": true,
  "es6": true,
  "node": true
};

const rules = {
  "array-bracket-spacing": ["error", "never"],
  "arrow-parens": [
    "error",
    "as-needed",
    {
      "requireForBlockBody": true
    }
  ],
  "arrow-spacing": "error",
  "@typescript-eslint/ban-ts-comment": [2,
    {
    'ts-expect-error': 'allow-with-description',
    'ts-ignore': 'allow-with-description',
    'ts-nocheck': 'allow-with-description',
    'ts-check': 'allow-with-description',
     minimumDescriptionLength: 3,
  }],
  "@typescript-eslint/ban-types": "off",
  "block-spacing": ["error", "always"],
  "brace-style": ["error", "1tbs"],
  "camelcase": [
    "error",
    {
      "properties": "never"
    }
  ],
  "comma-dangle": ["error", "never"],
  "eol-last": ["error", "always"],
  "@typescript-eslint/explicit-module-boundary-types": "off",
  "func-name-matching": "error",
  "indent": [
    "off",
    2,
    {
      "ArrayExpression": "off",
      "SwitchCase": 1,
      "CallExpression": {
        "arguments": "off"
      },
      "FunctionDeclaration": {
        "parameters": "off"
      },
      "FunctionExpression": {
        "parameters": "off"
      },
      "MemberExpression": "off",
      "ObjectExpression": "off",
      "ImportDeclaration": "off"
    }
  ],
  "handle-callback-err": "off",
  "linebreak-style": ["error", "unix"],
  "max-lines": [
    "warn",
    {
      "max": 300,
      "skipBlankLines": true,
      "skipComments": true
    }
  ],
  "max-lines-per-function": [
    "warn",
    {
      "skipBlankLines": true,
      "skipComments": true
    }
  ],
  "max-statements-per-line": [
    "error",
    {
      "max": 1
    }
  ],
  "new-cap": [
    "error",
    {
      "newIsCap": true,
      "capIsNew": false
    }
  ],
  "new-parens": "error",
  "no-buffer-constructor": "error",
  "no-console": "off",
  "@typescript-eslint/no-explicit-any": "off",
  "@typescript-eslint/no-empty-function": "off",
  "no-extra-semi": "off",
  "no-fallthrough": "off",
  "no-func-assign": "off",
  "no-implicit-coercion": "error",
  "no-multi-assign": "error",
  "no-multiple-empty-lines": [
    "error",
    {
      "max": 1
    }
  ],
  "no-nested-ternary": "warn",
  "no-param-reassign": "off",
  "no-return-assign": "error",
  "no-return-await": "off",
  "no-shadow-restricted-names": "error",
  "no-tabs": "error",
  "no-trailing-spaces": "error",
  "no-unused-vars": "off",
  "@typescript-eslint/no-unused-vars": [
    "error",
    {
      "vars": "all",
      "args": "none",
      "ignoreRestSiblings": false
    }
  ],
  "no-use-before-define": "off",
  "@typescript-eslint/no-use-before-define": [
    "error",
    {
      "functions": false,
      "classes": false
    }
  ],
  "no-useless-escape": "off",
  "no-var": "error",
  "nonblock-statement-body-position": ["error", "below"],
  "object-curly-spacing": ["error", "always"],
  "padded-blocks": ["error", "never"],
  "prefer-arrow-callback": "error",
  "prefer-const": [
    "error",
    {
      "destructuring": "all",
      "ignoreReadBeforeAssign": true
    }
  ],
  "prefer-template": "off",
  "quotes": ["error", "single"],
  "react/display-name": "off",
  "semi": ["error", "always"],
  "spaced-comment": [
    "error",
    "always",
    {
      "exceptions": ["!"]
    }
  ],
  "space-before-blocks": "error",
  "unicode-bom": ["error", "never"],
  "valid-jsdoc": "error",
  "wrap-iife": ["error", "inside"],
  "react/jsx-closing-bracket-location": 1,
  "react/jsx-tag-spacing": 1,
  "react/jsx-max-props-per-line": ["error", { "maximum": 2, "when": "multiline" }],
  "react/prop-types": 0
};

module.exports = {
  "env": env,
  "extends": [
    "plugin:react/recommended",
    "eslint:recommended",
  ],
  "settings": {
    "react": {
      "version": "^16.5.2"
    }
  },
  "parser": "babel-eslint",
  "parserOptions": {
    "ecmaVersion": 10,
    "requireConfigFile": false,
    "sourceType": "module"
  },
  "root": true,
  "rules": rules,
  "overrides": [
    {
      "files": ["**/*.ts", "**/*.tsx"],
      "env": env,
      "extends": [
        "eslint:recommended",
        "plugin:@typescript-eslint/eslint-recommended",
        "plugin:@typescript-eslint/recommended"
      ],
      "parser": "@typescript-eslint/parser",
      "parserOptions": {
        "ecmaFeatures": { "jsx": true },
        "ecmaVersion": 10,
        "requireConfigFile": false,
        "sourceType": "module"
      },
      "plugins": ["@typescript-eslint"],
      "rules": {
        ...rules,
        "valid-jsdoc": "off"
      }
    }
  ]
};