from io import BytesIO
from pathlib import Path
from base64 import b64encode

from qrcode import constants
from qrcode.main import QRCode
from qrcode.image.pil import PilImage


def convert_to_qr(data: str, **kwarg) -> bytes:
    """Convert data to QR code
    Args:
        data (str): data to be converted
    Returns:
        bytes: QR code image
    """
    qr = QRCode(
        version=1,
        error_correction=constants.ERROR_CORRECT_L,
        box_size=10,
        border=2,
        image_factory=PilImage,
    )
    qr.add_data(data)
    qr.make(fit=True)
    f = BytesIO()
    qr.make_image(**kwarg).save(f)
    return f.getvalue()


def web_embed_image(pic_data: bytes | Path | BytesIO, *, ext: str = "png"):
    """将图片数据转换为Base64编码的Data URI"""
    match pic_data:
        case bytes():
            pic_bytes = pic_data
        case Path():
            pic_bytes = Path(pic_data).read_bytes()
        case BytesIO():
            pic_bytes = pic_data.getvalue()
        case _:
            raise TypeError("pic_data must be bytes, Path or BytesIO")
    return f"data:image/{ext};base64,{b64encode(pic_bytes).decode()}"