#!/usr/bin/env python3
"""Convert squircle PNGs to circular-framed versions.

Applies an inscribed circular alpha mask to each PNG in the squircle dir.
Handles RGBA / LA / P modes uniformly via .convert('RGBA').
Proportional margin for 128/256/512 sizes. Idempotent.
"""
import os
import sys
import time
from PIL import Image, ImageDraw, ImageChops

SRC = "/root/nxt/terminal.net.br/design-system/tokens/assets/squircle"
DST = "/root/nxt/terminal.net.br/design-system/tokens/assets/circle"
SCALE = 4  # supersample factor for antialiased circle edge

_mask_cache = {}


def get_mask(size):
    if size not in _mask_cache:
        margin = round(20 * size / 512)
        big = size * SCALE
        m = Image.new("L", (big, big), 0)
        ImageDraw.Draw(m).ellipse(
            [margin * SCALE, margin * SCALE,
             (size - margin) * SCALE, (size - margin) * SCALE],
            fill=255,
        )
        _mask_cache[size] = m.resize((size, size), Image.LANCZOS)
    return _mask_cache[size]


def convert(src, dst):
    im = Image.open(src).convert("RGBA")
    if im.size[0] != im.size[1]:
        print(f"  skip non-square: {os.path.basename(src)} {im.size}", file=sys.stderr)
        return False
    mask = get_mask(im.size[0])
    r, g, b, a = im.split()
    im.putalpha(ImageChops.multiply(a, mask))
    im.save(dst, "PNG", optimize=True)
    return True


def main():
    os.makedirs(DST, exist_ok=True)
    files = sorted(f for f in os.listdir(SRC) if f.endswith(".png"))
    t0 = time.time()
    ok = 0
    for i, f in enumerate(files, 1):
        if convert(os.path.join(SRC, f), os.path.join(DST, f)):
            ok += 1
        if i % 50 == 0 or i == len(files):
            print(f"  {i}/{len(files)}")
    dt = time.time() - t0
    print(f"Done: {ok}/{len(files)} icons -> {DST} ({dt:.1f}s)")


if __name__ == "__main__":
    main()
