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

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

  async up() {
    this.schema.createTable(this.tableName, (table) => {
      table.uuid('id').primary().notNullable().defaultTo(this.raw('gen_random_uuid()'))
      // Pas de FK org : passe par invoice → org. Mais on garde un cache
      // pour les requêtes scope-by-org sans join (dashboard, jobs).
      table
        .uuid('organization_id')
        .notNullable()
        .references('id')
        .inTable('organizations')
        .onDelete('CASCADE')
      table
        .uuid('invoice_id')
        .notNullable()
        .references('id')
        .inTable('invoices')
        .onDelete('CASCADE')
      table
        .uuid('plan_step_id')
        .notNullable()
        .references('id')
        .inTable('plan_steps')
        // RESTRICT pour éviter qu'une suppression d'étape (cas rare V1
        // puisque l'édition de plan recrée tout) casse les tasks programmées.
        // En pratique, l'édition de plan en cours fait un DELETE+INSERT
        // des steps — les tasks pointant sur les vieux steps perdent
        // leur référence et il faut les annuler. Géré côté édition plan.
        .onDelete('RESTRICT')

      table.timestamp('send_at').notNullable()
      table
        .enum('status', ['scheduled', 'sent', 'cancelled', 'failed'], {
          useNative: true,
          enumName: 'relance_task_status',
        })
        .notNullable()
        .defaultTo('scheduled')
      table.timestamp('sent_at').nullable()
      // ID BullMQ pour pouvoir cancel le job programmé.
      table.string('queue_job_id', 100).nullable()

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

      table.index(['organization_id', 'status'])
      table.index(['invoice_id'])
      table.index(['send_at'])
    })
  }

  async down() {
    this.schema.dropTable(this.tableName)
    this.schema.raw('DROP TYPE IF EXISTS relance_task_status')
  }
}
