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

/**
 * Boîte de réception démo : quand `org.demo_mode = true`, les emails
 * de relance et de check-in ne partent PAS via Resend mais sont stockés
 * ici. Lus par le SPA via `/demo/inbox` pour montrer "ce que le client
 * recevrait" pendant la démo live.
 *
 *  - kind : type d'email (relance ou checkin)
 *  - to / from : adresses telles qu'on les aurait envoyées
 *  - subject / body : interpolés (toutes les variables résolues)
 *  - sent_at : DateTime virtuelle de l'envoi (= virtual_now au moment T)
 *  - meta : invoiceId / clientId pour permettre des liens dans l'UI
 *
 * Pas de relation FK : on garde une trace même si la facture est
 * supprimée ensuite (l'inbox démo doit être robuste à un reset partiel).
 */
export default class extends BaseSchema {
  protected tableName = 'demo_captured_emails'

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

      table.string('kind', 16).notNullable() // 'relance' | 'checkin'
      table.string('to_email', 254).notNullable()
      table.string('to_name', 200).nullable()
      table.string('from_email', 254).notNullable()
      table.string('from_name', 200).nullable()
      table.string('reply_to', 254).nullable()
      table.string('subject', 200).notNullable()
      table.text('body').notNullable()
      table.jsonb('meta').notNullable().defaultTo('{}')
      table.timestamp('sent_at', { useTz: true }).notNullable()

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

      // Lectures principales : la dernière inbox d'une org, en ordre desc.
      table.index(['organization_id', 'sent_at'])
    })
  }

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