#!/usr/bin/env python3
"""find_api_key.py — Sucht den Gemini-API-Key in der konfigurierten Umgebungsvariablen.

Standalone nutzbar: python3 find_api_key.py

Der Name der Umgebungsvariablen kommt aus skill.config.yaml
(features.api_key_env_var, Default: GEMINI_API_KEY). Fällt der Config-Load
fehl oder ist die Datei nicht vorhanden, wird "GEMINI_API_KEY" verwendet.

Sicherheits-Regel: Der Key wird NIE ausgegeben — nur "OK" + Länge.
"""

from __future__ import annotations

import sys
from pathlib import Path

# Bundle-Foundation: zentrale API-Key-Lookup-Lib (seit v0.17.3, vereinfacht v0.17.6).
# Seit v0.17.6 sind beide _lib/-Verzeichnisse Namespace Packages (Repo-Root/_lib/
# für designsystem, .skills/_lib/ für api_keys + test_utils etc.). Python mergt
# __path__ automatisch, sodass `from _lib.api_keys import ...` in beiden sys.path-
# Reihenfolgen funktioniert, solange .skills/ in sys.path liegt.
_SKILLS_ROOT = Path(__file__).resolve().parent.parent.parent
if str(_SKILLS_ROOT) not in sys.path:
    sys.path.insert(0, str(_SKILLS_ROOT))

from _lib.api_keys import get_api_key  # noqa: E402


def _resolve_env_var_name(skill_dir: Path) -> str:
    """Liest features.api_key_env_var aus skill.config.yaml.

    Deterministisch: Bei Lese-/Parse-Fehlern wird der Default "GEMINI_API_KEY"
    zurückgegeben — kein silent-fallback auf zufällige Suche.
    """
    config_path = skill_dir / "skill.config.yaml"
    if not config_path.exists():
        return "GEMINI_API_KEY"
    try:
        import yaml  # local import — yaml ist transient via google-genai
    except ImportError:
        return "GEMINI_API_KEY"
    try:
        data = yaml.safe_load(config_path.read_text(encoding="utf-8")) or {}
    except (OSError, yaml.YAMLError):
        return "GEMINI_API_KEY"
    features = data.get("features") or {}
    value = features.get("api_key_env_var")
    if isinstance(value, str) and value.strip():
        return value.strip()
    return "GEMINI_API_KEY"


def find_api_key(skill_dir: Path | None = None) -> tuple[str | None, str | None]:
    """Sucht den API-Key mit drei Fallback-Stufen.

    Stufe 1: Umgebungsvariable (konfiguriert via skill.config.yaml)
    Stufe 2: .env im aktuellen Arbeitsverzeichnis (Projekt-Root)
    Stufe 3: assets/.env im Skill-Verzeichnis

    Returns: (api_key, quelle) oder (None, None) wenn nichts gefunden.

    Wrapper über _lib.api_keys.get_api_key. Hält den nano-banana-spezifischen
    skill.config.yaml-Override (features.api_key_env_var) lokal — _lib weiß
    nichts von Skill-Configs. Der __main__-Block und strikte Aufrufer sollen
    bei (None, None) selbst sys.exit(1) aufrufen.
    """
    if skill_dir is None:
        skill_dir = Path(__file__).resolve().parent.parent
    env_var = _resolve_env_var_name(skill_dir)
    return get_api_key(env_var, skill_dir)


if __name__ == "__main__":
    skill_dir = Path(__file__).resolve().parent.parent
    env_var = _resolve_env_var_name(skill_dir)
    api_key, source = find_api_key(skill_dir)
    if api_key:
        # Sicherheit: Niemals den Key oder Teile davon ausgeben.
        # Nur bestätigen, dass ein Key gefunden wurde.
        print("OK")
        print(f"Länge: {len(api_key)} Zeichen")
    else:
        project_env = Path.cwd() / ".env"
        skill_env = skill_dir / "assets" / ".env"
        print(f"API-Key in Umgebungsvariable {env_var} nicht gefunden.")
        print()
        print("Optionen:")
        print(f"  1. Shell-Profil: export {env_var}=...")
        print(f"  2. .env im Projekt-Root ({project_env}) mit {env_var}=...")
        print(f"  3. Skill-assets/.env ({skill_env}) mit {env_var}=...")
        print("  4. 1Password CLI mit op-run-Wrapper (siehe INSTALL.md)")
        sys.exit(1)
