"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = exports.EditAction = void 0;

var _notFoundError = _interopRequireDefault(require("../../utils/errors/not-found-error"));

var _populator = _interopRequireDefault(require("../../utils/populator/populator"));

var _paramConverter = require("../../../utils/param-converter");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
 * @implements Action
 * @category Actions
 * @module EditAction
 * @description
 * Shows form for updating existing record
 * @private
 *
 * @classdesc
 * Uses {@link EditAction} component to render form
 */
const EditAction = {
  name: 'edit',
  isVisible: true,
  actionType: 'record',
  icon: 'Edit',
  showInDrawer: false,

  /**
   * Responsible for updating existing record.
   *
   * To invoke this action use {@link ApiClient#recordAction}
   *
   * @return  {RecordActionResponse}  populated record
   * @implements Action#handler
   * @memberof module:EditAction
   */
  handler: async (request, response, context) => {
    var _populatedRecord$base;

    const {
      record,
      resource,
      currentAdmin,
      h,
      translateMessage
    } = context;

    if (!record) {
      throw new _notFoundError.default([`Record of given id ("${request.params.recordId}") could not be found`].join('\n'), 'Action#handler');
    }

    if (request.method === 'get') {
      return {
        record: record.toJSON(currentAdmin)
      };
    }

    const params = _paramConverter.paramConverter.prepareParams(request.payload ?? {}, resource);

    const newRecord = await record.update(params);
    const [populatedRecord] = await (0, _populator.default)([newRecord]); // eslint-disable-next-line no-param-reassign

    context.record = populatedRecord;

    if (record.isValid()) {
      var _resource$_decorated;

      return {
        redirectUrl: h.resourceUrl({
          resourceId: ((_resource$_decorated = resource._decorated) === null || _resource$_decorated === void 0 ? void 0 : _resource$_decorated.id()) || resource.id()
        }),
        notice: {
          message: translateMessage('successfullyUpdated', resource.id()),
          type: 'success'
        },
        record: populatedRecord.toJSON(currentAdmin)
      };
    }

    const baseMessage = ((_populatedRecord$base = populatedRecord.baseError) === null || _populatedRecord$base === void 0 ? void 0 : _populatedRecord$base.message) || translateMessage('thereWereValidationErrors', resource.id());
    return {
      record: populatedRecord.toJSON(currentAdmin),
      notice: {
        message: baseMessage,
        type: 'error'
      }
    };
  }
};
exports.EditAction = EditAction;
var _default = EditAction;
exports.default = _default;