import fp from 'fastify-plugin';
import Stripe from 'stripe';
import type { FastifyInstance } from 'fastify';

/**
 * Catalogue des plans supportés par l'application. Les `priceId` sont
 * injectés via les variables d'environnement pour faciliter le passage
 * test → prod sans redéploiement.
 */
export interface StripePlan {
  id: 'essential' | 'premium';
  name: string;
  description: string;
  priceId: string | undefined;
  monthlyRecipes: number | null;
  features: string[];
}

export function getPlans(): StripePlan[] {
  return [
    {
      id: 'essential',
      name: 'Essentiel',
      description: 'Pour les cuisiniers réguliers',
      priceId: process.env.STRIPE_PRICE_ID_ESSENTIAL,
      monthlyRecipes: 15,
      features: [
        '15 recettes par mois',
        'Reconnaissance vocale des ingrédients',
        'Préférences culinaires',
        'Sauvegarde des recettes',
        'Support par email',
      ],
    },
    {
      id: 'premium',
      name: 'Premium',
      description: 'Pour les passionnés de cuisine',
      priceId: process.env.STRIPE_PRICE_ID_PREMIUM,
      monthlyRecipes: null,
      features: [
        'Recettes illimitées',
        'Reconnaissance vocale des ingrédients',
        'Préférences culinaires',
        'Sauvegarde des recettes',
        'Images haute qualité',
        'Support prioritaire',
      ],
    },
  ];
}

export function getPlanById(id: string): StripePlan | undefined {
  return getPlans().find((p) => p.id === id);
}

export function getPlanByPriceId(priceId: string): StripePlan | undefined {
  return getPlans().find((p) => p.priceId === priceId);
}

export default fp(async function stripePlugin(fastify: FastifyInstance) {
  const key = process.env.STRIPE_SECRET_KEY;
  if (!key) {
    fastify.log.warn('STRIPE_SECRET_KEY non définie — le plugin Stripe est désactivé');
    return;
  }

  const stripe = new Stripe(key, {
    apiVersion:
      (process.env.STRIPE_API_VERSION as Stripe.StripeConfig['apiVersion']) ?? '2023-10-16',
    typescript: true,
  });

  fastify.decorate('stripe', stripe);

  fastify.decorate('createCustomer', (email: string, name: string) =>
    stripe.customers.create({ email, name, metadata: { source: 'freedge' } })
  );

  fastify.decorate('createSubscription', (customerId: string, priceId: string) =>
    stripe.subscriptions.create({
      customer: customerId,
      items: [{ price: priceId }],
      payment_behavior: 'default_incomplete',
      expand: ['latest_invoice.payment_intent'],
    })
  );
});
