#!/usr/bin/env python3
"""Generate esphome/component_aliases.py from component ALIASES declarations.

Run without arguments to regenerate the registry; ``--check`` (run in CI)
verifies it is up to date.
"""

import argparse
from pathlib import Path
import sys

# The root directory of the repo
root = Path(__file__).parent.parent
# Make the repo's esphome package win over any installed copy
sys.path.insert(0, str(root))

from esphome.helpers import write_file_if_changed  # noqa: E402
from esphome.loader import _build_alias_map  # noqa: E402

parser = argparse.ArgumentParser()
parser.add_argument(
    "--check",
    help="Check if the alias registry is up to date.",
    action="store_true",
)
args = parser.parse_args()

registry_file = root / "esphome" / "component_aliases.py"

HEADER = '''"""Component alias registry.

Generated by script/build_alias_registry.py - do not edit manually.
See the component-alias section of esphome/loader.py.
"""

# alias -> (canonical component, removal version or None)
COMPONENT_ALIASES: dict[str, tuple[str, str | None]] = {
'''

# _build_alias_map scans the real component tree and already rejects
# duplicate and shadowing aliases with an EsphomeError.
_, alias_meta = _build_alias_map()

lines = [HEADER]
for alias, meta in sorted(alias_meta.items()):
    removal = f'"{meta.removal_version}"' if meta.removal_version else "None"
    lines.append(f'    "{alias}": ("{meta.canonical}", {removal}),\n')
lines.append("}\n")
content = "".join(lines)

if args.check:
    if registry_file.read_text(encoding="utf-8") != content:
        print("Component alias registry is not up to date.")
        print("Please run `script/build_alias_registry.py`")
        sys.exit(1)
    print("Component alias registry is up to date")
else:
    write_file_if_changed(registry_file, content)
    print(f"Wrote {registry_file}")
