import { Model } from 'pinia-orm'

/**
 * Base class for resources that can be fetched from the API
 */
class ApiResource extends Model {
  // eslint-disable-next-line no-use-before-define
  protected static _iriEncodedFields: Record<string, ApiResource>

  public static addIriEncodedField(name: string, target: ApiResource) {
    if (!this._iriEncodedFields) {
      this._iriEncodedFields = {}
    }
    this._iriEncodedFields[name] = target
  }

  public static getIriEncodedFields() {
    return this._iriEncodedFields
  }

  /**
   * Fix the 'Cannot stringify arbitrary non-POJOs' warning, meaning server can not parse the store
   *
   * @see https://github.com/vuex-orm/vuex-orm/issues/255#issuecomment-876378684
   */
  toJSON() {
    return { ...this }
  }

  /**
   * Is it a newly created entity?
   *
   * If it is, it means this entity does not exist in the data source and that it has a temporary id
   */
  public isNew(): boolean {
    return (
      !this.id || (typeof this.id === 'string' && this.id.slice(0, 3) === 'tmp')
    )
  }
}

export default ApiResource
