#!/usr/bin/env python3
"""
Simple test showing how users will use GitEnv.from_docker_image().

This is the simplest possible usage.

Prerequisites:
    1. .env file configured (copy from .env.example)
    2. Shared Gitea running: ./scripts/setup_shared_gitea.sh
    3. OpenEnv repo migrated to Gitea (see README)
"""

import os
import sys
from pathlib import Path

# Load environment variables from .env file
from dotenv import load_dotenv
load_dotenv()

# Add src to path
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))

from git_env import GitAction, GitEnv


def main():
    """Test GitEnv.from_docker_image()."""
    print("=" * 60)
    print("GitEnv.from_docker_image() Test")
    print("=" * 60)
    print()

    try:
        # Pass environment variables from .env to container
        env_vars = {
            "GITEA_URL": os.getenv("GITEA_URL"),
            "GITEA_USERNAME": os.getenv("GITEA_USERNAME"),
            "GITEA_PASSWORD": os.getenv("GITEA_PASSWORD"),
        }

        # Verify env vars are loaded
        if not all(env_vars.values()):
            print("❌ Error: Required environment variables not found in .env")
            print("   Make sure .env file exists (copy from .env.example)")
            return False

        print("Creating client from Docker image with .env credentials...")
        print("  Using GitEnv.from_docker_image() factory method")
        print()

        # Create client using from_docker_image factory method
        client = GitEnv.from_docker_image("git-env:latest", env_vars=env_vars)

        print("✓ Client created and container started!\n")

        # Now use it like any other client
        print("Testing the environment:")
        print("-" * 60)

        # Reset
        print("\n1. Reset:")
        result = client.reset()
        print(f"   Message: {result.observation.message}")
        print(f"   Success: {result.observation.success}")

        # Get initial state
        state = client.state()
        print(f"   State: episode_id={state.episode_id}, step_count={state.step_count}")
        print(f"   Gitea ready: {state.gitea_ready}")

        # List repositories
        print("\n2. List repositories:")
        result = client.step(GitAction(action_type="list_repos"))
        print(f"   Success: {result.observation.success}")
        print(f"   Found {len(result.observation.repos)} repositories")
        for repo in result.observation.repos:
            print(f"     - {repo['name']}")

        # Clone repository
        print("\n3. Clone repository:")
        result = client.step(GitAction(action_type="clone_repo", repo_name="OpenEnv"))
        print(f"   Success: {result.observation.success}")
        print(f"   Message: {result.observation.message}")
        print(f"   Output: {result.observation.output}")

        # Execute git commands
        print("\n4. Execute git commands:")

        git_commands = [
            "status",
            "log --oneline -5",
            "branch -a",
        ]

        for cmd in git_commands:
            result = client.step(
                GitAction(action_type="execute_git_command", command=cmd, working_dir="OpenEnv")
            )
            print(f"\n   git {cmd}:")
            print(f"   Success: {result.observation.success}")
            if result.observation.output:
                # Show first few lines
                lines = result.observation.output.strip().split("\n")[:5]
                for line in lines:
                    print(f"     {line}")
                if len(result.observation.output.strip().split("\n")) > 5:
                    print("     ...")

        # Check final state
        print("\n5. Check final state:")
        state = client.state()
        print(f"   episode_id: {state.episode_id}")
        print(f"   step_count: {state.step_count}")
        print(f"   gitea_ready: {state.gitea_ready}")

        print("\n" + "-" * 60)
        print("\n✓ All operations successful!")
        print()

        print("Cleaning up...")
        client.close()
        print("✓ Container stopped and removed")
        print()

        print("=" * 60)
        print("Test completed successfully!")
        print("=" * 60)

        return True

    except Exception as e:
        print(f"\n❌ Test failed: {e}")
        import traceback

        traceback.print_exc()
        return False


if __name__ == "__main__":
    success = main()
    exit(0 if success else 1)
