{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module LndClient.QRCode
  ( qrGeneric,
    qrPixels,
    qrPngDataUrl,
    qrDefOpts,
    QROpts (..),
    QRPixels (..),
    QRPngDataUrl (..),
  )
where

import Codec.Picture (Image (..), Pixel8)
import Codec.QRCode as QR
  ( ErrorLevel (L),
    QRImage,
    TextEncoding (Iso8859_1OrUtf8WithoutECI),
    ToText,
    defaultQRCodeOptions,
    encodeAutomatic,
  )
import Codec.QRCode.JuicyPixels (toImage, toPngDataUrlT)
import LndClient.Import.External

newtype QRPixels = QRPixels (Image Pixel8)

newtype QRPngDataUrl = QRPngDataUrl Text
  deriving (PersistField, PersistFieldSql, Show, Eq)

data QROpts
  = QROpts
      { qrBorder :: Int,
        qrScale :: Int
      }

qrDefOpts :: QROpts
qrDefOpts =
  QROpts
    { qrBorder = 4,
      qrScale = 5
    }

qrGeneric :: QR.ToText a => a -> Maybe QRImage
qrGeneric = encodeAutomatic (defaultQRCodeOptions L) Iso8859_1OrUtf8WithoutECI

qrPixels :: QR.ToText a => QROpts -> a -> Maybe QRPixels
qrPixels opts x = QRPixels . toImage (qrBorder opts) (qrScale opts) <$> qrGeneric x

qrPngDataUrl :: QR.ToText a => QROpts -> a -> Maybe QRPngDataUrl
qrPngDataUrl opts x =
  QRPngDataUrl . toStrict . toPngDataUrlT (qrBorder opts) (qrScale opts)
    <$> qrGeneric x