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

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

  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
        .uuid('client_id')
        .notNullable()
        .references('id')
        .inTable('clients')
        // RESTRICT plutôt que CASCADE : on ne veut pas qu'un user qui delete
        // par erreur un client perde toutes ses factures (audit + comptable).
        .onDelete('RESTRICT')
      // Plan nullable — une facture peut être créée sans plan assigné.
      table
        .uuid('plan_id')
        .nullable()
        .references('id')
        .inTable('plans')
        .onDelete('SET NULL')

      table.string('numero', 50).notNullable()
      // Montants : toujours en centimes (int), jamais float.
      table.integer('amount_ttc_cents').notNullable()
      table.timestamp('issue_date').notNullable()
      table.timestamp('due_date').notNullable()

      table
        .enum(
          'status',
          [
            'pending',
            'awaiting_user_confirmation',
            'in_relance',
            'paid',
            'litigation',
            'cancelled',
          ],
          { useNative: true, enumName: 'invoice_status' }
        )
        .notNullable()
        .defaultTo('pending')

      table.string('pdf_storage_key', 500).nullable()
      table.text('notes').nullable()
      // Compteur de rubis générés par cette facture (cf. CLAUDE.md → glossaire).
      // Bonus initial à la création (1) + bonus à l'encaissement (1).
      table.integer('rubis_earned').notNullable().defaultTo(0)
      table.timestamp('paid_at').nullable()

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

      // Indexes :
      // - filtre par status (chips dashboard) : (org, status)
      // - filtre par client : (org, client_id)
      // - tri par échéance : (org, due_date)
      table.index(['organization_id', 'status'])
      table.index(['organization_id', 'client_id'])
      table.index(['organization_id', 'due_date'])
      // Numéro unique par org : pas de doublon de numero F-2026-0042
      table.unique(['organization_id', 'numero'])
    })
  }

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