import { BaseSchema } from '@adonisjs/lucid/schema'

export default class extends BaseSchema {
  protected tableName = 'refresh_tokens'

  async up() {
    this.schema.createTable(this.tableName, (table) => {
      table.uuid('id').primary().notNullable().defaultTo(this.raw('gen_random_uuid()'))
      table
        .uuid('user_id')
        .notNullable()
        .references('id')
        .inTable('users')
        .onDelete('CASCADE')

      // SHA-256 du token plain (64 chars hex). On stocke le hash, pas le
      // plain — protection en cas de fuite de la DB. Le hash est unique
      // pour permettre un lookup rapide en O(1) sur (hash) lors du refresh.
      table.string('hashed_token', 64).notNullable().unique()

      table.timestamp('expires_at').notNullable()
      table.timestamp('last_used_at').nullable()
      table.timestamp('revoked_at').nullable()

      // Audit/forensique : utile pour invalider une session suspecte
      // (ip soudaine depuis un autre pays, etc.). Pas affiché dans l'UI V1.
      table.string('ip_address', 64).nullable()
      table.string('user_agent', 500).nullable()

      table.timestamp('created_at').notNullable()
      table.timestamp('updated_at').nullable()

      // Index pour les rotations rapides + nettoyage des tokens expirés
      table.index(['user_id'])
      table.index(['expires_at'])
    })
  }

  async down() {
    this.schema.dropTable(this.tableName)
  }
}
