"""実行ファイル用アイコン（assets/VA_mintsCheck.ico）を生成するスクリプト。

「mintsチェック」の文字列を含んだアイコンにするとの指示（2026-07-21）に
基づき、アプリのテーマ（ui/theme.py）と同じMicrosoft系アクセント青の
角丸タイルに、白い太字で「mints」「チェック」を2行組みで描画する。
1行に収めると小サイズで判読不能になるため2行に分ける。

バイナリ（.ico）をリポジトリにコミットしつつ、再現手順もコードとして
残すため、生成はこのスクリプトで行う（samples/のgenerate_sample_folder.py
と同じ方針）。

実行方法：
    .venv\\Scripts\\python.exe scripts\\generate_icon.py

生成後、mints_prep.specのicon指定によりexeへ埋め込まれる。
"""

from __future__ import annotations

from pathlib import Path

from PIL import Image, ImageDraw, ImageFont

ROOT = Path(__file__).resolve().parent.parent
ICON_PATH = ROOT / "assets" / "VA_mintsCheck.ico"

# ui/theme.py の ACCENT と同じMicrosoft系アクセント青。
BACKGROUND = "#0078d4"
TEXT_COLOR = "white"

# 太字の日本語フォント候補（Windows標準搭載。上から順に探索）。
_FONT_CANDIDATES = (
    r"C:\Windows\Fonts\YuGothB.ttc",
    r"C:\Windows\Fonts\meiryob.ttc",
    r"C:\Windows\Fonts\meiryo.ttc",
    r"C:\Windows\Fonts\msgothic.ttc",
)

_CANVAS = 256  # マスター画像の一辺（ここから各サイズへ縮小生成する）
_ICO_SIZES = [(256, 256), (128, 128), (64, 64), (48, 48), (32, 32), (16, 16)]


def _load_font(size_px: int) -> ImageFont.FreeTypeFont:
    for path in _FONT_CANDIDATES:
        if Path(path).exists():
            return ImageFont.truetype(path, size_px, index=0)
    raise FileNotFoundError(f"日本語フォントが見つかりません（候補：{', '.join(_FONT_CANDIDATES)}）")


def _fit_font(draw: ImageDraw.ImageDraw, text: str, max_width: int, start_px: int) -> ImageFont.FreeTypeFont:
    """textがmax_widthに収まる最大のフォントサイズを探す。"""
    for size_px in range(start_px, 8, -2):
        font = _load_font(size_px)
        bbox = draw.textbbox((0, 0), text, font=font)
        if bbox[2] - bbox[0] <= max_width:
            return font
    return _load_font(8)


def build() -> None:
    ICON_PATH.parent.mkdir(parents=True, exist_ok=True)

    image = Image.new("RGBA", (_CANVAS, _CANVAS), (0, 0, 0, 0))
    draw = ImageDraw.Draw(image)

    # 角丸タイル（Windows 11系アプリアイコンの慣行に合わせた角丸比率）。
    radius = _CANVAS // 6
    draw.rounded_rectangle((0, 0, _CANVAS - 1, _CANVAS - 1), radius=radius, fill=BACKGROUND)

    margin = 20
    max_width = _CANVAS - margin * 2
    line1, line2 = "mints", "チェック"
    font1 = _fit_font(draw, line1, max_width, start_px=110)
    font2 = _fit_font(draw, line2, max_width, start_px=90)

    bbox1 = draw.textbbox((0, 0), line1, font=font1)
    bbox2 = draw.textbbox((0, 0), line2, font=font2)
    h1 = bbox1[3] - bbox1[1]
    h2 = bbox2[3] - bbox2[1]
    gap = 14
    total_h = h1 + gap + h2
    y1 = (_CANVAS - total_h) // 2 - bbox1[1]
    y2 = (_CANVAS - total_h) // 2 + h1 + gap - bbox2[1]

    draw.text(((_CANVAS - (bbox1[2] - bbox1[0])) // 2 - bbox1[0], y1), line1, font=font1, fill=TEXT_COLOR)
    draw.text(((_CANVAS - (bbox2[2] - bbox2[0])) // 2 - bbox2[0], y2), line2, font=font2, fill=TEXT_COLOR)

    image.save(ICON_PATH, format="ICO", sizes=_ICO_SIZES)
    print(f"生成完了：{ICON_PATH}")


if __name__ == "__main__":
    build()
