import Stripe from 'stripe';

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY || '', {
  apiVersion: '2024-12-18.acacia' as any,
});

const PRODUCTS = {
  daily_pass: {
    name: 'Today Only Pass',
    amount: 499, // $4.99
    picks: 999,
  },
  monthly_pass: {
    name: 'The Rain Man — Monthly Unlimited',
    amount: 1999, // $19.99
    picks: 999999, // effectively unlimited
    recurring: true,
  },
};

export async function createCheckoutSession(data: {
  userId: string;
  email: string;
  productType: 'daily_pass' | 'monthly_pass';
  quantity?: number;
  successUrl: string;
  cancelUrl: string;
  clientTimezone?: string;
  purchaseIp?: string;
}): Promise<string> {
  const product = PRODUCTS[data.productType];
  if (!product) throw new Error('Invalid product type');

  const totalPicks = product.picks;

  if (data.productType === 'monthly_pass') {
    // Recurring subscription via Stripe
    const session = await stripe.checkout.sessions.create({
      mode: 'subscription',
      customer_email: data.email,
      line_items: [
        {
          price_data: {
            currency: 'usd',
            product_data: {
              name: product.name,
            },
            unit_amount: product.amount,
            recurring: { interval: 'month', interval_count: 1 },
          },
          quantity: 1,
        },
      ],
      metadata: {
        userId: data.userId,
        productType: data.productType,
        picksGranted: String(totalPicks),
      },
      subscription_data: {
        metadata: {
          userId: data.userId,
          productType: data.productType,
          picksGranted: String(totalPicks),
        },
      },
      success_url: data.successUrl,
      cancel_url: data.cancelUrl,
    });

    return session.url || '';
  }

  // One-time payment (Today Only Pass)
  const session = await stripe.checkout.sessions.create({
    mode: 'payment',
    customer_email: data.email,
    line_items: [
      {
        price_data: {
          currency: 'usd',
          product_data: {
            name: product.name,
          },
          unit_amount: product.amount,
        },
        quantity: 1,
      },
    ],
    metadata: {
      userId: data.userId,
      productType: data.productType,
      picksGranted: String(totalPicks),
      clientTimezone: data.clientTimezone || '',
      purchaseIp: data.purchaseIp || '',
    },
    success_url: data.successUrl,
    cancel_url: data.cancelUrl,
  });

  return session.url || '';
}

export async function verifySession(sessionId: string): Promise<{
  paid: boolean;
  userId: string;
  productType: string;
  picksGranted: number;
  amountCents: number;
  paymentIntentId: string;
  clientTimezone: string;
  purchaseIp: string;
} | null> {
  const session = await stripe.checkout.sessions.retrieve(sessionId);
  if (session.payment_status !== 'paid') return null;

  return {
    paid: true,
    userId: session.metadata?.userId || '',
    productType: session.metadata?.productType || '',
    picksGranted: parseInt(session.metadata?.picksGranted || '0', 10),
    amountCents: session.amount_total || 0,
    paymentIntentId: typeof session.payment_intent === 'string' ? session.payment_intent : '',
    clientTimezone: session.metadata?.clientTimezone || '',
    purchaseIp: session.metadata?.purchaseIp || '',
  };
}

export function constructWebhookEvent(body: Buffer, signature: string): Stripe.Event {
  return stripe.webhooks.constructEvent(
    body,
    signature,
    process.env.STRIPE_WEBHOOK_SECRET || ''
  );
}

export { stripe, PRODUCTS };
