/*
 * SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file)
 *
 * SPDX-License-Identifier: AGPL-3.0-only
 */

'use strict';

const loggerFunctions = ['error', 'log', 'warn', 'debug', 'verbose'];

module.exports = {
  'correct-logger-context': {
    meta: {
      fixable: 'code',
      type: 'problem',
      docs: {
        recommended: true,
      },
      schema: [],
    },
    create: function (context) {
      return {
        CallExpression: function (node) {
          if (
            node.callee.type === 'MemberExpression' &&
            node.callee.object.type === 'MemberExpression' &&
            node.callee.object.property.name === 'logger' &&
            loggerFunctions.includes(node.callee.property.name) &&
            !!node.arguments &&
            node.arguments.length === 2
          ) {
            const usedContext = node.arguments[1].value;
            let correctContext = 'undefined';
            const ancestors = context.getAncestors();
            for (let index = ancestors.length - 1; index >= 0; index--) {
              if (ancestors[index].type === 'MethodDefinition') {
                correctContext = ancestors[index].key.name;
                break;
              }
            }
            if (usedContext !== correctContext) {
              context.report({
                node: node,
                message: `Used wrong context in log statement`,
                fix: function (fixer) {
                  return fixer.replaceText(
                    node.arguments[1],
                    `'${correctContext}'`
                  );
                },
              });
            }
          }
        },
      };
    },
  },
  'no-typeorm-equal': {
    meta: {
      type: 'problem',
      fixable: 'code',
      messages: {
        noEqual:
          'TypeORMs Equal constructor is buggy and therefore not allowed.',
      },
    },
    create: function (context) {
      return {
        Identifier: function (node) {
          if (node.name === 'Equal' && node.parent.type === 'CallExpression') {
            context.report({
              node: node,
              messageId: 'noEqual',
              fix: function (fixer) {
                return fixer.replaceText(
                  node.parent,
                  `{ id: ${node.parent.arguments[0].name}.id }`
                );
              },
            });
          }
        },
      };
    },
  },
};