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

/**
 * Subscription / billing — chaque org a un plan + des refs Stripe pour
 * piloter abonnement & encaissement.
 *
 *  - plan : 'free' (default) | 'pro' | 'business'
 *  - grace_period_ends_at : 3 mois après l'inscription (free unlimited
 *    pendant cette fenêtre — au-delà, bloqué à 5 factures actives).
 *  - stripe_customer_id / stripe_subscription_id : nullable jusqu'à
 *    la 1re souscription. Stockés pour pouvoir piloter le Customer Portal.
 *  - subscription_status : copié du Stripe webhook (`active`, `trialing`,
 *    `past_due`, `canceled`, `incomplete`, `unpaid`).
 *  - current_period_end : pour afficher "votre abonnement renouvelle le X".
 *  - billing_cycle : 'monthly' | 'yearly' — facilite l'affichage UI sans
 *    re-fetcher Stripe à chaque rendu.
 */
export default class extends BaseSchema {
  protected tableName = 'organizations'

  async up() {
    this.schema.alterTable(this.tableName, (table) => {
      table.string('plan', 20).notNullable().defaultTo('free')
      table.timestamp('grace_period_ends_at', { useTz: true }).nullable()

      table.string('stripe_customer_id', 255).nullable().unique()
      table.string('stripe_subscription_id', 255).nullable().unique()
      table.string('subscription_status', 30).nullable()
      table.string('billing_cycle', 10).nullable() // 'monthly' | 'yearly'
      table.timestamp('current_period_end', { useTz: true }).nullable()
    })

    // Backfill : pour les orgs déjà créées, on pose grace_period_ends_at
    // à created_at + 3 mois (équivaut à un signup démarrant maintenant).
    this.defer(async (db) => {
      await db
        .from(this.tableName)
        .whereNull('grace_period_ends_at')
        .update({
          grace_period_ends_at: db.raw(`created_at + interval '3 months'`),
        })
    })
  }

  async down() {
    this.schema.alterTable(this.tableName, (table) => {
      table.dropColumn('plan')
      table.dropColumn('grace_period_ends_at')
      table.dropColumn('stripe_customer_id')
      table.dropColumn('stripe_subscription_id')
      table.dropColumn('subscription_status')
      table.dropColumn('billing_cycle')
      table.dropColumn('current_period_end')
    })
  }
}
