meta {
  name: 04 Reactivate
  type: http
  seq: 4
}

post {
  url: {{baseUrl}}/api/v1/billing/reactivate
  body: none
  auth: bearer
}

auth:bearer {
  token: {{token}}
}

tests {
  test("200 OK", function () {
    expect(res.getStatus()).to.equal(200);
  });
  test("ok=true", function () {
    expect(res.getBody().data.ok).to.equal(true);
  });
}

docs {
  POST /api/v1/billing/reactivate — auth requise

  Annule une annulation programmée — la subscription continue son cycle
  normal, sans paiement immédiat.

  Effets :
  - Retrieve le sub Stripe pour savoir laquelle des 2 mécaniques est posée
    (Stripe REFUSE qu'on passe `cancel_at_period_end` ET `cancel_at` dans
    le même update : "Please pass in only one")
  - Si `cancel_at` est posé → on envoie `cancel_at: null`
  - Sinon → on envoie `cancel_at_period_end: false`
  - Persiste sur l'org : `cancel_at_period_end = false`

  Idempotent :
  - Si l'org n'a pas de sub Stripe → 400 `no_active_subscription`
  - Si l'annulation n'est PAS programmée → 200 `{ok: true}` sans toucher Stripe

  Réponse :
  ```json
  { "data": { "ok": true } }
  ```

  ## Pour tester

  1. Annule la sub via le Customer Portal (03 Open portal → click Cancel)
  2. Vérifie via **01 Get subscription** : `cancelAtPeriodEnd: true`
  3. Lance cette requête
  4. Re-vérifie : `cancelAtPeriodEnd: false`
}
