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

/**
 * The name plugin might be a bit confusing because you also have Nuxt plugins, but
 * this is not the same. A plugin can contain hooks for certain events such as when
 * a user account is created.
 */
export class BaserowPlugin extends Registerable {
  constructor(...args) {
    super(...args)
    this.type = this.getType()
  }

  /**
   * Hook that is called when a user creates a new account. This can for example be
   * used for submitting an analytical event.
   */
  userCreated(user, context) {}

  /**
   * Every registered plugin can have a component that's rendered at the top of the
   * left sidebar.
   */
  getSidebarTopComponent() {
    return null
  }

  /*
   * Every registered plugin can display an item in the main sidebar menu.
   */
  getSidebarMainMenuComponent() {
    return null
  }

  /*
   * Every registered plugin can display a component in the links section of the
   * dashboard sidebar.
   */
  getDashboardSidebarLinksComponent() {
    return null
  }

  /*
   * Every registered plugin can display a component in the `DashboardGroup`
   * component directly after the group name.
   */
  getDashboardGroupExtraComponent() {
    return null
  }

  /*
   * Every registered plugin can display a component in the `DashboardGroup`
   * component directly below the group name.
   */
  getDashboardGroupComponent() {
    return null
  }

  /**
   * Because the dashboard could contain dynamic `getDashboardGroupComponent` and
   * `getDashboardGroupExtraComponent` components, it could be that additional data
   * must be fetched from the backend when the page first loads. This method can be
   * overwritten to do that.
   */
  fetchAsyncDashboardData(context, data) {
    return data
  }

  /**
   * Every registered plugin can display a component in the `AuthRegister` component
   * directly at the bottom of the form. This component can be used to extend the
   * register functionality.
   */
  getRegisterComponent() {
    return null
  }

  /**
   * Every registered plugin can display a component in the `app.vue` layout. This
   * is the root component that's being used for every authenticated page in the app.
   */
  getAppLayoutComponent() {
    return null
  }

  /**
   * If set, this components in the list will be rendered directly after the user
   * creates an account. It must emit a `success` event when the user must be
   * redirected to the next page.
   */
  getAfterSignupStepComponent() {
    return []
  }

  /*
   * Every registered plugin can display multiple additional public share link options
   * which will be visible on the share public view context.
   */
  getAdditionalShareLinkOptions() {
    return []
  }
}