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

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

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

      // Position dans le plan (0-indexed, monotone croissante).
      table.integer('order').notNullable()
      // Décalage par rapport à la date d'échéance, peut être négatif (rappel
      // avant échéance). Plage raisonnable -30 à 180 jours côté validator.
      table.integer('offset_days').notNullable()
      // Enum check côté DB pour garantir l'intégrité même hors Vine.
      table
        .enum('tone', ['amical', 'courtois', 'ferme', 'mise_en_demeure'], {
          useNative: true,
          enumName: 'plan_step_tone',
        })
        .notNullable()
      table.string('subject', 200).notNullable()
      table.text('body').notNullable()
      // Mise en demeure : pas d'envoi auto, validation manuelle par l'user
      // (cf. CLAUDE.md → Principes produit).
      table.boolean('requires_manual_validation').notNullable().defaultTo(false)

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

      table.index(['plan_id', 'order'])
    })
  }

  async down() {
    this.schema.dropTable(this.tableName)
    // Drop le type ENUM PG créé par useNative
    this.schema.raw('DROP TYPE IF EXISTS plan_step_tone')
  }
}
