import { Controller, Post, Req, Res, Headers } from '@nestjs/common'
import { WebhookService } from '@services/webhook.service'
import { Request, Response } from 'express'
import * as crypto from 'crypto'
import { PaymentService } from '@services/payment.service'

@Controller('webhooks')
export class WebhookController {
	private readonly WEBHOOK_SECRET = process.env.QUICKBOOKS_WEBHOOK_SECRET || ''
	constructor(private readonly webhookService: WebhookService, private readonly paymentService: PaymentService) {}

	@Post('quickbooks/invoice')
	async quickbooks(@Req() req: Request, @Res() res: Response, @Headers('intuit-signature') signature: string) {
		const rawBody = JSON.stringify(req.body)

		// Verify QuickBooks Webhook Signature
		if (!this.verifySignature(rawBody, signature)) {
			return res.status(400).send('Invalid signature')
		}

		const event = req.body

		let mockEvent = {
			eventNotifications: [
				{
					realmId: '1234567890',
					dataChangeEvent: {
						entities: [
							{
								name: 'Invoice',
								id: '987654321',
								operation: 'Create',
								lastUpdated: '2025-03-23T12:34:56.789Z',
							}
						]
					}
				}
			]
		}

		// Handle different event types
		for (const notification of event.eventNotifications) {
			const entity = notification.dataChangeEvent.entities[0]

			console.log(`Received event for ${entity.name}:`, entity)

			// Process entity changes here (e.g., update database)
			if (entity?.name === 'Invoice' && entity?.operation === 'Create') {
				const paymentLink = await this.paymentService.addPaymentLink(entity.id)
				console.log("paymentLink", paymentLink)
			}
		}

		return
	}
	private verifySignature(payload: string, signature: string): boolean {
		const hmac = crypto.createHmac('sha256', this.WEBHOOK_SECRET)
		hmac.update(payload)
		const calculatedSignature = hmac.digest('base64')
		return calculatedSignature === signature
	}
}
