"""
Genera l'icona di QuantoBasta: «q.b.» scritto a mano, crema su terracotta.

Non e' un disegno importato: si compone col carattere vero dell'app, cosi' il
marchio dell'icona e quello dell'intestazione sono la stessa mano. Se un domani
il carattere cambia, questo script rifa' tutto.

Il centraggio non si fida della riga tipografica. In un corsivo le lettere non
riempiono il rettangolo del font — Caveat lascia sopra lo spazio per le aste
alte e sotto per le code — e centrare su quel rettangolo manda il disegno
sbilenco. Qui il testo si disegna grande su una tela di servizio, si misura
l'inchiostro VERO con getbbox(), e quel ritaglio si centra nella tela finale.
"""
from PIL import Image, ImageDraw, ImageFont
import pathlib

TERRA = (174, 79, 44)      # #AE4F2C, l'accento dell'app
CREMA = (253, 248, 243)    # #FDF8F3, il fondo chiaro dell'app
TERRA_CHIARA = (224, 138, 95)  # #E08A5F, l'accento del tema scuro
FONT = 'node_modules/@expo-google-fonts/caveat/700Bold/Caveat_700Bold.ttf'
TESTO = 'q.b.'

def inchiostro(colore, corpo=900):
    """Il testo ritagliato sui pixel che ha davvero, niente margini del font."""
    tela = Image.new('RGBA', (corpo * 3, corpo * 3), (0, 0, 0, 0))
    ImageDraw.Draw(tela).text(
        (corpo // 2, corpo // 2), TESTO,
        font=ImageFont.truetype(FONT, corpo), fill=colore,
    )
    return tela.crop(tela.getbbox())

def componi(lato, fondo, colore, occupa):
    """`occupa` e' la frazione del lato che il marchio deve coprire in larghezza."""
    marchio = inchiostro(colore)
    larg = int(lato * occupa)
    alt = max(1, round(marchio.size[1] * larg / marchio.size[0]))
    marchio = marchio.resize((larg, alt), Image.LANCZOS)
    tela = Image.new('RGBA', (lato, lato), fondo)
    tela.paste(marchio, ((lato - larg) // 2, (lato - alt) // 2), marchio)
    return tela

fuori = pathlib.Path('assets')

# iOS: 1024, niente trasparenza e niente angoli arrotondati, li mette il sistema.
componi(1024, TERRA + (255,), CREMA + (255,), 0.74).convert('RGB').save(fuori / 'icon.png')

# Android adattiva: il primo piano deve stare nel 66% centrale, perche' il
# sistema ritaglia la forma che vuole — cerchio, goccia, quadrato smussato.
componi(512, (0, 0, 0, 0), CREMA + (255,), 0.40).save(fuori / 'android-icon-foreground.png')
Image.new('RGB', (512, 512), TERRA).save(fuori / 'android-icon-background.png')

# Monocromatica, per i temi dinamici di Android: solo la forma, il sistema tinge.
componi(512, (0, 0, 0, 0), (0, 0, 0, 255), 0.40).save(fuori / 'android-icon-monochrome.png')

# Schermata d'avvio: solo il marchio su trasparente, il fondo lo mette il
# plugin. Ne servono DUE, e non e' un vezzo: la terracotta dell'app sul carbone
# scende a 3,3:1, cioe' sotto la soglia leggibile, mentre sul crema sta a 5,0:1.
# Per il buio si usa la stessa terracotta schiarita che il tema usa gia' li',
# che risale a 6,6:1. Sono gli stessi due colori di `accento` in tema.ts.
componi(512, (0, 0, 0, 0), TERRA + (255,), 0.72).save(fuori / 'splash-icon.png')
componi(512, (0, 0, 0, 0), TERRA_CHIARA + (255,), 0.72).save(fuori / 'splash-icon-dark.png')

componi(196, TERRA + (255,), CREMA + (255,), 0.74).convert('RGB').save(fuori / 'favicon.png')

for f in sorted(fuori.glob('*.png')):
    im = Image.open(f)
    print(f'  {f.name:32} {im.size[0]}x{im.size[1]}  {im.mode}')
