'use strict'

/** @type {import('@adonisjs/framework/src/Hash')} */
const Hash = use('Hash')

/** @type {typeof import('@adonisjs/lucid/src/Lucid/Model')} */
const Model = use('Model')

class User extends Model {
  static boot() {
    super
        .boot()

        /**
         * A hook to hash the user password before saving
         * it to the database.
         */
        this.addHook('beforeSave', async (userInstance) => {
          if (userInstance.dirty.password) {
            userInstance.password = await Hash.make(userInstance.password)
          }
        })
  }

  publicJSON() {
    const u = this.toJSON();
    return {
      avatar: `https://api.adorable.io/avatars/285/${u.email}.png`, id: u.id,
          name: u.name, isAdmin: u.is_admin
    }
  }

  static get hidden() {
    return ['password']
  }

  static get dates() {
    return super.dates.concat(['last_logged_in'])
  }

  /**
   * A relationship on tokens is required for auth to
   * work. Since features like `refreshTokens` or
   * `rememberToken` will be saved inside the
   * tokens table.
   *
   * @method tokens
   *
   * @return {Object}
   */
  tokens() {
    return this.hasMany('App/Models/Token')
  }

  links() {
    return this.hasMany('App/Models/Link')
  }
}

module.exports = User
