import { Request, Response } from 'express';
import { stripe } from '../lib/stripe';
import { SERVICES } from '../config/services';
import { CreateCheckoutSessionRequest, CreateCheckoutSessionResponse } from '../types';

export async function createCheckoutSession(
  req: Request<{}, CreateCheckoutSessionResponse, CreateCheckoutSessionRequest>,
  res: Response<CreateCheckoutSessionResponse | { error: string }>
): Promise<void> {
  try {
    if (!stripe) {
      res.status(503).json({
        error: 'Online checkout is temporarily unavailable. Please contact us to book.',
      });
      return;
    }

    const { serviceId, customerEmail } = req.body;

    if (!serviceId || !SERVICES[serviceId]) {
      res.status(400).json({ error: 'Invalid service ID' });
      return;
    }

    const service = SERVICES[serviceId];
    const origin = req.headers.origin || 'http://localhost:3000';

    const session = await stripe.checkout.sessions.create({
      payment_method_types: ['card'],
      line_items: [
        {
          price_data: {
            currency: 'usd',
            product_data: {
              name: service.name,
              description: service.description,
            },
            unit_amount: service.price,
          },
          quantity: 1,
        },
      ],
      mode: 'payment',
      success_url: `${origin}/pages/checkout-success.html?session_id={CHECKOUT_SESSION_ID}`,
      cancel_url: `${origin}/pages/checkout-cancel.html`,
      customer_email: customerEmail || undefined,
      metadata: {
        serviceId: serviceId,
        serviceName: service.name,
      },
    });

    res.json({ sessionId: session.id, url: session.url });
  } catch (error) {
    console.error('Error creating checkout session:', error);
    const errorMessage = error instanceof Error ? error.message : 'Unknown error';
    res.status(500).json({ error: errorMessage });
  }
}

