"""Benchmark the runtime micro-optimizations from 6b354159.

Targets:
  1. Style.__eq__ identity shortcut
  2. Style.combine/chain via _add (bypassing sum + __add__)
  3. Segment.simplify with `is` check

Usage:
  cd ~/rich && ~/venv313/bin/python ~/bench/bench_runtime2.py
"""

import os
import sys
import timeit

sys.path.insert(0, os.path.expanduser("~/rich"))


def bench(label, stmt, setup, number=500_000, repeat=7):
    times = timeit.repeat(stmt, setup, number=number, repeat=repeat)
    best = min(times)
    per_call_ns = best / number * 1e9
    print(
        f"  {label}: {best * 1000:.1f}ms/{number // 1000}K calls, {per_call_ns:.0f}ns/call"
    )
    return best


print(f"Python {sys.version}")
print()

common_setup = """\
import sys, os
sys.path.insert(0, os.path.expanduser("~/rich"))
from rich.style import Style
"""

# --- 1. Style.__eq__ ---
print("=== Style.__eq__ ===")
eq_setup = (
    common_setup
    + """\
s1 = Style(bold=True, color="red")
s2 = Style(bold=True, color="red")
# Force hash caching
hash(s1); hash(s2)
"""
)
bench("identity (s1 == s1)", "s1 == s1", eq_setup, number=1_000_000)
bench("equal (s1 == s2)", "s1 == s2", eq_setup, number=1_000_000)
bench(
    "not-equal (s1 != Style())",
    "s1 != Style()",
    eq_setup + "s3 = Style(); hash(s3)\n",
    number=1_000_000,
)
print()

# --- 2. Style.combine ---
print("=== Style.combine ===")
combine_setup = (
    common_setup
    + """\
styles = [Style(bold=True), Style(color="red"), Style(italic=True)]
"""
)
bench(
    "combine(3 styles)", "Style.combine(styles)", combine_setup, number=200_000
)

combine_setup_2 = (
    common_setup
    + """\
styles = [Style(bold=True), Style(color="red")]
"""
)
bench(
    "combine(2 styles)",
    "Style.combine(styles)",
    combine_setup_2,
    number=200_000,
)
print()

# --- 3. Style.chain ---
print("=== Style.chain ===")
chain_setup = (
    common_setup
    + """\
s1 = Style(bold=True)
s2 = Style(color="red")
s3 = Style(italic=True)
"""
)
bench(
    "chain(3 styles)", "Style.chain(s1, s2, s3)", chain_setup, number=200_000
)
print()

# --- 4. Segment.simplify ---
print("=== Segment.simplify ===")
simplify_setup = (
    common_setup
    + """\
from rich.segment import Segment
style_a = Style(bold=True, color="red")
# Same object reference (common case)
segs_identity = [Segment("hello ", style_a), Segment("world", style_a), Segment("! ", style_a)]
# Equal but different objects
style_b = Style(bold=True, color="red")
segs_equal = [Segment("hello ", style_a), Segment("world", style_b), Segment("! ", style_a)]
# Different styles (no merge)
style_c = Style(italic=True)
segs_diff = [Segment("hello ", style_a), Segment("world", style_c), Segment("! ", style_a)]
"""
)
bench(
    "simplify (identity styles)",
    "list(Segment.simplify(segs_identity))",
    simplify_setup,
    number=200_000,
)
bench(
    "simplify (equal styles)",
    "list(Segment.simplify(segs_equal))",
    simplify_setup,
    number=200_000,
)
bench(
    "simplify (diff styles)",
    "list(Segment.simplify(segs_diff))",
    simplify_setup,
    number=200_000,
)
print()

# --- 5. E2E Console.print ---
print("=== E2E Console.print ===")
e2e_setup = (
    common_setup
    + """\
from rich.console import Console
from rich.text import Text
c = Console(file=open(os.devnull, "w"), color_system="truecolor")
markup = "[bold red]Error:[/bold red] Something [italic]went wrong[/italic] in [blue underline]module.py[/blue underline]:42"
"""
)
bench(
    "Console.print(markup)",
    "c.print(markup)",
    e2e_setup,
    number=5_000,
    repeat=5,
)
print()

print("Done.")
