/**
 * @ai-summary Webhook controller for Stripe events
 * @ai-context Handles incoming Stripe webhook events with signature verification
 */

import { FastifyRequest, FastifyReply } from 'fastify';
import { logger } from '../../../core/logging/logger';
import { SubscriptionsService } from '../domain/subscriptions.service';
import { SubscriptionsRepository } from '../data/subscriptions.repository';
import { StripeClient } from '../external/stripe/stripe.client';
import { pool } from '../../../core/config/database';

export class WebhooksController {
  private service: SubscriptionsService;

  constructor() {
    const repository = new SubscriptionsRepository(pool);
    const stripeClient = new StripeClient();
    this.service = new SubscriptionsService(repository, stripeClient, pool);
  }

  /**
   * Handle Stripe webhook events
   * POST /api/webhooks/stripe
   */
  async handleStripeWebhook(request: FastifyRequest, reply: FastifyReply): Promise<void> {
    try {
      // Get raw body from request (must be enabled via config: { rawBody: true })
      const rawBody = (request as any).rawBody;
      if (!rawBody) {
        logger.error('Missing raw body in webhook request');
        return reply.status(400).send({ error: 'Missing raw body' });
      }

      // Get Stripe signature from headers
      const signature = request.headers['stripe-signature'];
      if (!signature || typeof signature !== 'string') {
        logger.error('Missing or invalid Stripe signature');
        return reply.status(400).send({ error: 'Missing Stripe signature' });
      }

      // Process the webhook event
      await this.service.handleWebhookEvent(rawBody, signature);

      // Return 200 to acknowledge receipt
      return reply.status(200).send({ received: true });
    } catch (error: any) {
      logger.error('Webhook handler error', {
        error: error.message,
        stack: error.stack,
      });

      // Return 400 for signature verification failures
      if (error.message.includes('signature') || error.message.includes('verify')) {
        return reply.status(400).send({ error: 'Invalid signature' });
      }

      // Return 500 for other errors
      return reply.status(500).send({ error: 'Webhook processing failed' });
    }
  }
}
