"""
Portal logo monogram — "DH" on solid #1974CE, rounded square.
Reads at 32px header chip and 512px upload.
Distinct from the group paw circle: this is the portal/brand chip.
"""
from PIL import Image, ImageDraw, ImageFont
import os

OUT = os.path.dirname(os.path.abspath(__file__))
BLUE       = (25, 116, 206, 255)   # #1974CE
BLUE_DARK  = (13, 79, 138, 255)    # #0d4f8a
WHITE      = (255, 255, 255, 255)
OUTFIT     = os.path.join(OUT, "fonts", "Outfit-ExtraBold.ttf")
OUTFIT_BLK = os.path.join(OUT, "fonts", "Outfit-Black.ttf")


def make_monogram(size, bg, fg, text="DH",
                  radius_pct=0.22, font_pct=0.52, font_path=OUTFIT_BLK,
                  letter_spacing=-0.04, dark_edge=True, shape="rounded"):
    """Monogram on a shape. shape='rounded' (default) or 'circle' (for avatar slots
    that Kanamé force-crops to a circle). Supersample 4x → downsample for clean edges."""
    SS = 4
    s = size * SS
    img = Image.new("RGBA", (s, s), (0, 0, 0, 0))
    d = ImageDraw.Draw(img)
    if shape == "circle":
        d.ellipse([0, 0, s - 1, s - 1], fill=bg)
    else:
        r = int(s * radius_pct)
        d.rounded_rectangle([0, 0, s - 1, s - 1], radius=r, fill=bg)

    # Letters
    font_size = int(s * font_pct)
    f = ImageFont.truetype(font_path, font_size)

    # Measure each letter for tight kerning
    advances = []
    for ch in text:
        bb = f.getbbox(ch)
        advances.append(bb[2] - bb[0])
    spacing_px = int(font_size * letter_spacing)
    total_w = sum(advances) + spacing_px * (len(text) - 1)

    # Use a representative letter (bbox of full text minus spacing) for vertical centering
    full_bb = f.getbbox(text)
    text_h = full_bb[3] - full_bb[1]

    x = (s - total_w) // 2 - f.getbbox(text[0])[0]
    y = (s - text_h) // 2 - full_bb[1]

    cur_x = x
    for ch in text:
        d.text((cur_x, y), ch, font=f, fill=fg)
        bb = f.getbbox(ch)
        cur_x += (bb[2] - bb[0]) + spacing_px

    return img.resize((size, size), Image.LANCZOS)


# Primary 512×512 — for upload to Kanamé Settings → Branding → Logo
logo_512 = make_monogram(512, BLUE, WHITE)
logo_512.save(os.path.join(OUT, "sprocketts-portal-logo-512.png"), optimize=True)

# 1024 retina
logo_1024 = make_monogram(1024, BLUE, WHITE)
logo_1024.save(os.path.join(OUT, "sprocketts-portal-logo-1024.png"), optimize=True)

# 256 — backup mid-size
logo_256 = make_monogram(256, BLUE, WHITE)
logo_256.save(os.path.join(OUT, "sprocketts-portal-logo-256.png"), optimize=True)

# 64 / 32 — header chip / favicon-equivalent test
# At very small sizes, slightly thicker font + less tight tracking renders better
logo_64 = make_monogram(64, BLUE, WHITE, font_pct=0.58, letter_spacing=-0.02)
logo_64.save(os.path.join(OUT, "sprocketts-portal-logo-64.png"), optimize=True)

logo_32 = make_monogram(32, BLUE, WHITE, font_pct=0.62, letter_spacing=0.0)
logo_32.save(os.path.join(OUT, "sprocketts-portal-logo-32.png"), optimize=True)

# Inverse (white bg, blue letters) for any dark-mode placements that need it
logo_inv = make_monogram(512, WHITE, BLUE, dark_edge=False)
logo_inv.save(os.path.join(OUT, "sprocketts-portal-logo-inverse-512.png"), optimize=True)

# CIRCULAR variants — for Kanamé GROUP AVATAR slot (force-cropped to circle).
# Use this in Settings → Communities → Group → Avatar / Profile Picture.
# Rounded-square stays for portal-wide header logo (top-left chip).
circ_512 = make_monogram(512, BLUE, WHITE, shape="circle", font_pct=0.50, letter_spacing=-0.04)
circ_512.save(os.path.join(OUT, "sprocketts-group-avatar-DH-512.png"), optimize=True)
circ_1024 = make_monogram(1024, BLUE, WHITE, shape="circle", font_pct=0.50, letter_spacing=-0.04)
circ_1024.save(os.path.join(OUT, "sprocketts-group-avatar-DH-1024.png"), optimize=True)

# Preview sheet — show at multiple sizes against light + dark
prev = Image.new("RGB", (1400, 800), (250, 250, 250))
pd = ImageDraw.Draw(prev)
sizes = [(512, 80, 130), (256, 660, 270), (128, 980, 330),
         (64, 1180, 370), (32, 1280, 400)]
for sz, x, y in sizes:
    s = make_monogram(sz, BLUE, WHITE)
    prev.paste(s, (x, y), s)

# Dark band
pd.rectangle([0, 470, 1400, 800], fill=(20, 22, 30))
for sz, x, y in [(128, 80, 530), (64, 280, 580), (32, 400, 615), (16, 460, 625)]:
    s = make_monogram(sz, BLUE, WHITE) if sz > 16 else make_monogram(16, BLUE, WHITE, font_pct=0.66)
    prev.paste(s, (x, y), s)

lbl_font = ImageFont.truetype(OUTFIT, 24)
pd.text((80, 40), "PORTAL LOGO ON LIGHT", font=lbl_font, fill=(60, 60, 60))
pd.text((80, 490), "PORTAL LOGO ON DARK", font=lbl_font, fill=(220, 220, 220))
size_lbl = ImageFont.truetype(OUTFIT, 14)
for sz, x, y in [(512, 200, 645), (256, 700, 540), (128, 1015, 470),
                 (64, 1190, 450), (32, 1280, 440)]:
    pd.text((x, y), f"{sz}", font=size_lbl, fill=(120, 120, 120))

prev.save(os.path.join(OUT, "_portal-logo-preview.png"), optimize=True)

print("Built:")
for f in sorted(os.listdir(OUT)):
    if f.startswith("sprocketts-portal-logo") or f == "_portal-logo-preview.png":
        p = os.path.join(OUT, f)
        print(f"  {f}  ({os.path.getsize(p)//1024} KB)")
