"""
Repinta el texto del logo definitiva.png cambiando "NETWORX" por "LEONEX"
y manteniendo el subtitulo "GLOBAL DATA TECHNOLOGIES". Conserva el leon,
el globo, el aro neon aqua exterior y todos los detalles del original.

Uso:
    python tools/relabel_logo.py

Entrada:
    assets/definitiva_pre_leonex_backup.png  (siempre reescribimos desde el
    backup limpio para que repetir el script no degrade la imagen)

Salida:
    assets/definitiva.png   (sobrescribe)
"""

from __future__ import annotations

from pathlib import Path
from PIL import Image, ImageDraw, ImageFilter, ImageFont

ROOT = Path(__file__).resolve().parents[1]
ASSETS = ROOT / "assets"
TARGET = ASSETS / "definitiva.png"
BACKUP = ASSETS / "definitiva_pre_leonex_backup.png"

# Caja ESTRICTAMENTE dentro del aro aqua, donde solo hay fondo negro y el
# texto antiguo NETWORX + GLOBAL DATA TECHNOLOGIES. Estos limites no tocan
# ni el aro del circulo ni la curva inferior.
TEXT_BOX_LEFT = 60
TEXT_BOX_RIGHT = 358
TEXT_BOX_TOP = 295
TEXT_BOX_BOTTOM = 350

# Colores
BLACK = (0, 0, 0)
AQUA = (140, 245, 245)
AQUA_GLOW = (60, 200, 220)

# Fuentes (Poppins disponible en el sandbox de Cowork)
FONT_BOLD = Path("/usr/share/fonts/truetype/google-fonts/Poppins-Bold.ttf")
FONT_LIGHT = Path("/usr/share/fonts/truetype/google-fonts/Poppins-Medium.ttf")

TITLE_TEXT = "LEONEX"
SUBTITLE_TEXT = "GLOBAL DATA TECHNOLOGIES"


def _load_font(path: Path, size: int) -> ImageFont.FreeTypeFont:
    if path.exists():
        return ImageFont.truetype(str(path), size=size)
    fallback = Path("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf")
    return ImageFont.truetype(str(fallback), size=size)


def _measure(draw: ImageDraw.ImageDraw, text: str, font: ImageFont.FreeTypeFont,
             tracking: int = 0) -> tuple[int, int]:
    if tracking <= 0:
        bbox = draw.textbbox((0, 0), text, font=font)
        return bbox[2] - bbox[0], bbox[3] - bbox[1]
    width = 0
    height = 0
    for i, ch in enumerate(text):
        bbox = draw.textbbox((0, 0), ch, font=font)
        width += bbox[2] - bbox[0]
        height = max(height, bbox[3] - bbox[1])
        if i < len(text) - 1:
            width += tracking
    return width, height


def _draw_tracked(draw: ImageDraw.ImageDraw, xy: tuple[int, int], text: str,
                  font: ImageFont.FreeTypeFont, fill: tuple[int, int, int],
                  tracking: int) -> None:
    x, y = xy
    for ch in text:
        draw.text((x, y), ch, font=font, fill=fill)
        bbox = draw.textbbox((0, 0), ch, font=font)
        x += (bbox[2] - bbox[0]) + tracking


def relabel_logo() -> None:
    if not BACKUP.exists():
        raise FileNotFoundError(
            f"No existe {BACKUP}. Necesito el original limpio para no degradar el logo."
        )

    img = Image.open(BACKUP).convert("RGB")
    W, H = img.size

    # 1) Tapar SOLO la caja interior donde estaba el texto antiguo.
    draw = ImageDraw.Draw(img)
    draw.rectangle(
        [(TEXT_BOX_LEFT, TEXT_BOX_TOP), (TEXT_BOX_RIGHT, TEXT_BOX_BOTTOM)],
        fill=BLACK,
    )

    # 2) Tamanos conservadores para que LEONEX y la tagline encajen dentro.
    box_w = TEXT_BOX_RIGHT - TEXT_BOX_LEFT
    box_h = TEXT_BOX_BOTTOM - TEXT_BOX_TOP

    title_size = 36
    subtitle_size = 13
    title_tracking = 5
    subtitle_tracking = 2

    title_font = _load_font(FONT_BOLD, title_size)
    subtitle_font = _load_font(FONT_LIGHT, subtitle_size)

    title_w, title_h = _measure(draw, TITLE_TEXT, title_font, title_tracking)
    subtitle_w, subtitle_h = _measure(draw, SUBTITLE_TEXT, subtitle_font, subtitle_tracking)

    gap = 4
    block_h = title_h + gap + subtitle_h
    start_y = TEXT_BOX_TOP + (box_h - block_h) // 2

    title_x = TEXT_BOX_LEFT + (box_w - title_w) // 2
    subtitle_x = TEXT_BOX_LEFT + (box_w - subtitle_w) // 2
    title_y = start_y
    subtitle_y = start_y + title_h + gap

    # 3) Capa de resplandor difuminada y composicion en modo "lighten".
    glow_layer = Image.new("RGB", (W, H), BLACK)
    glow_draw = ImageDraw.Draw(glow_layer)
    _draw_tracked(glow_draw, (title_x, title_y), TITLE_TEXT, title_font, AQUA_GLOW, title_tracking)
    _draw_tracked(glow_draw, (subtitle_x, subtitle_y), SUBTITLE_TEXT, subtitle_font, AQUA_GLOW, subtitle_tracking)
    glow_layer = glow_layer.filter(ImageFilter.GaussianBlur(radius=3))

    base_pixels = img.load()
    glow_pixels = glow_layer.load()
    for y in range(TEXT_BOX_TOP, TEXT_BOX_BOTTOM):
        for x in range(TEXT_BOX_LEFT, TEXT_BOX_RIGHT):
            br, bg, bb = base_pixels[x, y]
            gr, gg, gb = glow_pixels[x, y]
            base_pixels[x, y] = (max(br, gr), max(bg, gg), max(bb, gb))

    # 4) Texto nitido encima del resplandor.
    _draw_tracked(draw, (title_x, title_y), TITLE_TEXT, title_font, AQUA, title_tracking)
    _draw_tracked(draw, (subtitle_x, subtitle_y), SUBTITLE_TEXT, subtitle_font, AQUA, subtitle_tracking)

    img.save(TARGET, format="PNG")
    print(f"[OK] {TARGET.name} actualizado: {TITLE_TEXT} + {SUBTITLE_TEXT}")
    print(f"     box texto x[{TEXT_BOX_LEFT}-{TEXT_BOX_RIGHT}] y[{TEXT_BOX_TOP}-{TEXT_BOX_BOTTOM}]")


if __name__ == "__main__":
    relabel_logo()
