import { BaseEvent } from '@adonisjs/core/events'
import { toBahrainCurrencyWords } from '../Helper/numberToCurrencyWordHelper.js'
import { ReceiptPaymentMethods, TimeZone } from '../../types/enum.js'
import { getSmtpSettings, sendEmailWithAttachment } from '../Helper/Helper.js'
import edge from 'edge.js'
import { Readable } from 'stream'
import puppeteerBrowser from '#start/puppeteer'
import GroupInvoiceReceipt from '#models/group_invoice_receipt'
import { CURRENCY } from '../../const/constants.js'

export default class ReceiptMailSend extends BaseEvent {
  /**
   * Accept event data as constructor parameters
   */
  constructor() {
    super()
  }

  /**
   * Load receipt details asynchronously
   */

  public async sendReceiptEmail(receiptId: number) {
    const smtpSettings = await getSmtpSettings()

    const groupInvoiceReceipt = await GroupInvoiceReceipt.query()
      .where('id', receiptId)
      .preload('customer_details')
      .preload('group_invoice_list')
      .firstOrFail()

    const htmlPageContent = {
      receiptGeneratedId: groupInvoiceReceipt.generated_receipt_id,
      modeOfPayment: ReceiptPaymentMethods[groupInvoiceReceipt.payment_method],
      paymentDate: groupInvoiceReceipt.paid_at.toFormat('dd LLL yyyy'),
      paidAmount: groupInvoiceReceipt.paid_amount,
      customerName:
        groupInvoiceReceipt.customer_details.company_name ||
        `${groupInvoiceReceipt.customer_details.first_name} ${groupInvoiceReceipt.customer_details.last_name}`,
      customerSingleLineAddressLineOne:
        groupInvoiceReceipt?.customer_details?.billing_address ??
        groupInvoiceReceipt.customer_details?.address_line_one,
      customerSingleLineAddressLineTwo: groupInvoiceReceipt.customer_details?.address_line_two,
      customerAddressLineOne:
        `${[groupInvoiceReceipt.customer_details?.addresses?.[0]?.block?.code, groupInvoiceReceipt.customer_details?.addresses?.[0]?.block?.name].join('-')}` ||
        '',
      customerAddressLineTwo: `${[groupInvoiceReceipt.customer_details?.addresses?.[0]?.road?.code, groupInvoiceReceipt.customer_details?.addresses?.[0]?.road?.name].join('-') || ''}, ${[groupInvoiceReceipt.customer_details?.addresses?.[0]?.building?.code, groupInvoiceReceipt.customer_details?.addresses?.[0]?.building?.name].join('-') || ''}`,
      billingAddress: groupInvoiceReceipt?.customer_details?.billing_address ?? '',
      customerPhoneNumber: groupInvoiceReceipt.customer_details.phone || '',
      customerEmail: groupInvoiceReceipt.customer_details.email || '',
      invoiceList: groupInvoiceReceipt.group_invoice_list.map((inv) => ({
        invoiceGeneratedId: inv.generated_invoice_id,
        invoiceDate: inv.invoice_date.toFormat('dd LLL yyyy'),
        invoiceDueDate: inv.due_date.toFormat('dd LLL yyyy'),
        invoiceCustomerName:
          groupInvoiceReceipt.customer_details.company_name ||
          `${groupInvoiceReceipt.customer_details.first_name} ${groupInvoiceReceipt.customer_details.last_name}`,
        invoiceAmount: inv.payable_amount,
      })),

      totalPayableAmount: groupInvoiceReceipt.calculated_amount,
      discount: groupInvoiceReceipt.discount_amount,
      netPaidAmount: groupInvoiceReceipt.paid_amount,
      netPaidAmountInWords: toBahrainCurrencyWords(groupInvoiceReceipt.paid_amount),
      transactionId: groupInvoiceReceipt.transaction_reference,
      transactionDate: groupInvoiceReceipt.paid_at
        .setZone(TimeZone)
        .toFormat('dd LLL yyyy, hh:mm:ss a'),
      notes: groupInvoiceReceipt.notes,
      currency: CURRENCY,
    }

    const htmlPagePath = 'pages/pdf/newReceipt'
    // const htmlInvoiceEmailPagePath = 'pages/pdf/groupInvoiceEmailBody'

    const page = await puppeteerBrowser.openNewPage()

    if (!page) {
      throw new Error('Failed to puppeteer browser page')
    }
    const afterRender = await edge.render(htmlPagePath, htmlPageContent)

    await page.setContent(afterRender)

    const pdf = await page.pdf({
      omitBackground: true,
      printBackground: true,
      timeout: 0,
      waitForFonts: true,
      // margin: { top: '20px', right: '20px', bottom: '20px', left: '20px' },
      // width: '120mm',
      // height: '170mm',
      format: 'A4',
    })

    await page.close()

    const pdfStream = new Readable()
    pdfStream.push(pdf)
    // pdfStream.contentType = 'application/pdf'
    pdfStream.push(null)
    const billingEmails = Array.isArray(groupInvoiceReceipt.customer_details.billing_emails)
      ? groupInvoiceReceipt.customer_details.billing_emails
      : groupInvoiceReceipt.customer_details.billing_emails
        ? groupInvoiceReceipt.customer_details.billing_emails.split(',').map((e) => e.trim())
        : []

    await sendEmailWithAttachment({
      to: groupInvoiceReceipt.customer_details.email,
      cc: [...billingEmails, smtpSettings.from.address], // cc billing emails
      subject: `Delybell Logistics Receipt ${groupInvoiceReceipt.generated_receipt_id}`,
      htmlPagePath: 'pages/emails/receiptEmail',
      htmlPageContent: {
        receiptNumber: groupInvoiceReceipt.generated_receipt_id,
        customerName:
          groupInvoiceReceipt.customer_details.company_name ||
          `${groupInvoiceReceipt.customer_details.first_name} ${groupInvoiceReceipt.customer_details.last_name}`,
      },
      attachments: pdfStream,
      fileName: `Receipt-${groupInvoiceReceipt.generated_receipt_id}.pdf`,
    })
    // ✅ Mark as sent
    // groupInvoiceReceipt.is_email_sent = true
    // groupInvoiceReceipt.email_sent_at = DateTime.now()
    // await groupInvoiceReceipt.save()
  }
}
