#!/usr/bin/env python3

import os
from pathlib import Path
import subprocess
import sys


def find_and_activate_virtualenv():
    if (
        ("VIRTUAL_ENV" in os.environ)
        or os.environ.get("DEVCONTAINER", False)
        or os.environ.get("ESPHOME_NO_VENV", False)
    ):
        return

    try:
        # Get the top-level directory of the git repository
        my_path = subprocess.check_output(
            ["git", "rev-parse", "--show-toplevel"], text=True
        ).strip()
    except subprocess.CalledProcessError:
        print(
            "Error: Not a git repository or unable to determine the top-level directory.",
            file=sys.stderr,
        )
        return

    # Check for virtual environments
    for venv in ["venv", ".venv", "."]:
        activate_path = (
            Path(my_path)
            / venv
            / ("Scripts" if os.name == "nt" else "bin")
            / "activate"
        )
        if activate_path.exists():
            # Activate the virtual environment by updating PATH
            venv_bin_dir = activate_path.parent
            os.environ["PATH"] = f"{venv_bin_dir}{os.pathsep}{os.environ['PATH']}"
            os.environ["VIRTUAL_ENV"] = str(venv_bin_dir.parent)
            print(f"Activated virtual environment: {venv_bin_dir.parent}")
            return

    print("No virtual environment found.", file=sys.stderr)


def run_command():
    # Execute the remaining arguments in the new environment
    if len(sys.argv) > 1:
        subprocess.run(sys.argv[1:], check=False)
    else:
        print(
            "No command provided to run in the virtual environment.",
            file=sys.stderr,
        )


if __name__ == "__main__":
    find_and_activate_virtualenv()
    run_command()