import qrcode
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import CircleModuleDrawer
from qrcode.image.styles.moduledrawers import SquareModuleDrawer
from qrcode.image.styles.colormasks import SolidFillColorMask
from PIL import ImageDraw
from io import BytesIO
from fastapi.responses import StreamingResponse

primary=(255,255,255)
secondary=(229,119,57)

def generate_qrcode(ssid, password, output_file="qr_code_custom_rounded.png"):
     # Wi-Fi QR code format
    wifi_data = f"WIFI:T:WPA;S:{ssid};P:{password};;"

    dot_size = 32
    quiet_size = 10

    # Create the QR code object
    qr = qrcode.QRCode(
        version=1,  # Controls the size of the QR code
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=dot_size,
        border=10,
    )
    qr.add_data(wifi_data)
    qr.make(fit=True)

    # Customize the QR code style with transparent background
    img = qr.make_image(image_factory=StyledPilImage,
                        module_drawer=CircleModuleDrawer(),  # Circular dots for modules
                        # eye_drawer=SquareModuleDrawer(),  # Use square for sharper eyes
                        color_mask=SolidFillColorMask(front_color=primary, back_color=secondary))  # Transparent background

    # Convert to a PIL Image before drawing
    pil_img = img.convert("RGBA")

    # Drawing on the image
    draw = ImageDraw.Draw(pil_img)
    
    img_width, img_height = pil_img.size
    
    # Draw rectangles (you can adjust the coordinates as per your requirement)
    rectangle_coors_default = [
        [40,40,109,109],
        [img_width-110, 40, img_width-40,110],
        [40, img_width-110, 110, img_height-40]
        ]
    
    quiet_pixels = quiet_size*dot_size
    rect_size = dot_size*7
    rectangle_coors = [
        [quiet_pixels,quiet_pixels,  quiet_pixels+rect_size,  quiet_pixels+rect_size],
        [img_width-quiet_pixels-rect_size, quiet_pixels, img_width-quiet_pixels,quiet_pixels+rect_size],
        [quiet_pixels, img_height-quiet_pixels-rect_size, quiet_pixels+rect_size, img_height-quiet_pixels]
        ]
    corner_radius = 79 
    border_width = 32
    
    for i in range(3):
        draw.rectangle(rectangle_coors[i],fill=secondary)
        draw.rounded_rectangle(rectangle_coors[i], radius=corner_radius, outline=primary, width=border_width)
    
    circle_center = [
        [quiet_pixels+rect_size/2,quiet_pixels+rect_size/2],
        [quiet_pixels+rect_size/2, img_height-quiet_pixels-rect_size/2],
        [img_width-quiet_pixels-rect_size/2,quiet_pixels+rect_size/2]
        ] 
    circle_radius = border_width +17
    for i in range(3):
        bounding_box = [circle_center[i][0] - circle_radius, circle_center[i][1] - circle_radius, 
                    circle_center[i][0] + circle_radius, circle_center[i][1] + circle_radius]
        draw.ellipse(bounding_box, fill=primary, outline=primary)

    buffer = BytesIO()
    pil_img.save(buffer, format="PNG")
    buffer.seek(0)
    
    return StreamingResponse(buffer, media_type="image/png")
