import User from '#models/user'
import Organization from '#models/organization'
import { provisionDefaultPlans } from '#services/default_plans'
import db from '@adonisjs/lucid/services/db'

let counter = 0

/**
 * Helper : crée une organisation + un user + provisionne les 4 plans
 * pré-fournis, dans une transaction. Retourne le user, l'org et un
 * access token Bearer prêt à être passé en header.
 *
 * `counter` rend les emails uniques entre les tests d'une même suite —
 * sans ça, les tests qui ne tombent pas dans une global tx risquent un
 * email_taken.
 */
export async function createTestUser(overrides: {
  email?: string
  password?: string
  fullName?: string
  orgName?: string
} = {}) {
  counter += 1
  const email = overrides.email ?? `test-${counter}-${Date.now()}@rubis.test`
  const password = overrides.password ?? 'password123'
  const fullName = overrides.fullName ?? `Test User ${counter}`
  const orgName = overrides.orgName ?? ''

  const { user, org } = await db.transaction(async (trx) => {
    const o = await Organization.create({ name: orgName }, { client: trx })
    await provisionDefaultPlans(o.id, trx)
    const u = await User.create({ email, password, fullName, organizationId: o.id }, { client: trx })
    return { user: u, org: o }
  })

  const token = await User.accessTokens.create(user)
  // .release() consomme la valeur — on capture une seule fois.
  const accessToken = token.value!.release()

  return {
    user,
    org,
    plainPassword: password,
    accessToken,
    bearer: { Authorization: `Bearer ${accessToken}` },
  }
}

/**
 * Variante : crée juste 2 users dans 2 orgs distinctes (pour les tests
 * cross-org : user A ne peut pas voir/modifier les ressources de B).
 */
export async function createTwoOrgs() {
  const a = await createTestUser({ orgName: 'Org A' })
  const b = await createTestUser({ orgName: 'Org B' })
  return { a, b }
}
