Clone
import QRCode from 'qrcode'

export async function generateQRCode(text, options = {}) {
  const defaultOptions = {
    errorCorrectionLevel: 'H', // High - allows 30% damage for logo overlay
    type: 'image/png',
    quality: 0.92,
    margin: 2,
    color: {
      dark: '#000000',
      light: '#FFFFFF'
    },
    width: 512
  }

  const qrOptions = { ...defaultOptions, ...options }

  try {
    const dataUrl = await QRCode.toDataURL(text, qrOptions)
    return dataUrl
  } catch (error) {
    console.error('QR Code generation error:', error)
    throw error
  }
}

export async function generateQRCodeWithLogo(text, logoUrl, options = {}) {
  console.log('Generating QR code with logo:', logoUrl)
  
  const canvas = document.createElement('canvas')
  const ctx = canvas.getContext('2d')
  
  canvas.width = options.width || 512
  canvas.height = options.height || 512

  // Generate QR code
  const qrDataUrl = await generateQRCode(text, {
    ...options,
    errorCorrectionLevel: 'H'
  })

  // Draw QR code
  const qrImage = new Image()
  qrImage.src = qrDataUrl
  
  return new Promise((resolve, reject) => {
    qrImage.onload = () => {
      ctx.drawImage(qrImage, 0, 0, canvas.width, canvas.height)

      if (logoUrl) {
        // Fetch logo as blob to avoid CORS issues
        fetch(logoUrl)
          .then(response => {
            if (!response.ok) throw new Error('Failed to fetch logo')
            return response.blob()
          })
          .then(blob => {
            const logo = new Image()
            const objectUrl = URL.createObjectURL(blob)
            
            logo.onload = () => {
              // Calculate logo size (max 25% of QR code for better scanning)
              const logoSize = Math.floor(canvas.width * 0.25)
              const logoX = (canvas.width - logoSize) / 2
              const logoY = (canvas.height - logoSize) / 2

              // Draw white background with rounded corners
              ctx.fillStyle = 'white'
              const padding = 8
              ctx.fillRect(logoX - padding, logoY - padding, logoSize + padding * 2, logoSize + padding * 2)

              // Draw logo
              ctx.drawImage(logo, logoX, logoY, logoSize, logoSize)
              
              // Clean up
              URL.revokeObjectURL(objectUrl)
              
              resolve(canvas.toDataURL())
            }

            logo.onerror = () => {
              console.error('Failed to load logo image')
              URL.revokeObjectURL(objectUrl)
              resolve(qrDataUrl)
            }
            
            logo.src = objectUrl
          })
          .catch(error => {
            console.error('Failed to fetch logo:', error)
            resolve(qrDataUrl)
          })
      } else {
        resolve(qrDataUrl)
      }
    }

    qrImage.onerror = reject
  })
}