import { Registerable } from '@baserow/modules/core/registry'

export class ViewDecoratorType extends Registerable {
  /**
   * A human readable name of the decorator type.
   */
  getName() {
    return null
  }

  /**
   * A description of the decorator type.
   */
  getDescription() {
    return null
  }

  /**
   * @returns the image URL to illustrate this decorator.
   */
  getImage() {
    return null
  }

  /**
   * If the decorator type is disabled, this text will be visible explaining why.
   */
  getDeactivatedText({ view }) {}

  /**
   * When the deactivated view decorator is clicked, this modal will be shown.
   */
  getDeactivatedClickModal() {
    return null
  }

  /**
   * Indicates if the decorator type is disabled.
   */
  isDeactivated(workspaceId) {
    return false
  }

  /**
   * Returns whether or not the user can add a new instance of this decorator.
   * A decorator might be disabled if, for example, there is already one occurrence
   * of the same type for the view.
   * The result must be an array. The first item is a boolean value, `true` if
   * the decorator is enabled. If not, it should be `false` and the second item
   * must be a user string describing the reason why it's not available.
   */
  canAdd({ view }) {
    return [false, '']
  }

  /**
   * Returns whether or not a given viewType is compatible with this view decorator.
   */
  isCompatible(view) {
    return false
  }

  /**
   * Should return the component that will actually decorate the record.
   */
  getComponent() {
    throw new Error(
      'Not implemented error. This view decorator should return a component.'
    )
  }

  /**
   * Returns the place where the decorator should appears. Allowed values are:
   * - `wrapper` if the decorator is a wrapper of the record.
   * - `first_cell` to decorate the first cell.
   */
  getPlace() {
    return null
  }

  getOrder() {
    return 50
  }

  /**
   * @return object
   */
  serialize() {
    return {
      type: this.type,
      name: this.getName(),
    }
  }
}