# -*- mode: python ; coding: utf-8 -*-
"""
PyInstaller spec file for OpenHands CLI.

This spec file configures PyInstaller to create a standalone executable
for the OpenHands CLI application.
"""

from pathlib import Path
import os
import sys
from PyInstaller.utils.hooks import (
    collect_submodules,
    collect_data_files,
    copy_metadata
)



# Get the project root directory (current working directory when running PyInstaller)
project_root = Path.cwd()

a = Analysis(
    ['openhands_cli/simple_main.py'],
    pathex=[str(project_root)],
    binaries=[],
    datas=[
        # Include any data files that might be needed
        # Add more data files here if needed in the future
        *collect_data_files('tiktoken'),
        *collect_data_files('tiktoken_ext'),
        *collect_data_files('litellm'),
        *collect_data_files('fastmcp'),
        *collect_data_files('mcp'),
        # Include Jinja prompt templates required by the agent SDK
        *collect_data_files('openhands.sdk.agent', includes=['prompts/*.j2']),
        # Include package metadata for importlib.metadata
        *copy_metadata('fastmcp'),
    ],
    hiddenimports=[
        # Explicitly include modules that might not be detected automatically
        *collect_submodules('openhands_cli'),
        *collect_submodules('prompt_toolkit'),
        # Include OpenHands SDK submodules explicitly to avoid resolution issues
        *collect_submodules('openhands.sdk'),
        *collect_submodules('openhands.tools'),
        *collect_submodules('tiktoken'),
        *collect_submodules('tiktoken_ext'),
        *collect_submodules('litellm'),
        *collect_submodules('fastmcp'),
        # Include mcp but exclude CLI parts that require typer
        'mcp.types',
        'mcp.client',
        'mcp.server',
        'mcp.shared',
        'openhands.tools.execute_bash',
        'openhands.tools.str_replace_editor',
        'openhands.tools.task_tracker',
    ],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    # runtime_hooks=[str(project_root / "hooks" / "rthook_profile_imports.py")],
    excludes=[
        # Exclude unnecessary modules to reduce binary size
        'tkinter',
        'matplotlib',
        'numpy',
        'scipy',
        'pandas',
        'IPython',
        'jupyter',
        'notebook',
        # Exclude mcp CLI parts that cause issues
        'mcp.cli',
        'prompt_toolkit.contrib.ssh',
        'fastmcp.cli',
        'boto3',
        'botocore',
        'posthog',
        'browser-use',
        'openhands.tools.browser_use'
    ],
    noarchive=False,
    # IMPORTANT: do not use optimize=2 (-OO) because it strips docstrings used by PLY/bashlex grammar
    optimize=0,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='openhands',
    debug=False,
    bootloader_ignore_signals=False,
    strip=True,  # Strip debug symbols to reduce size
    upx=True,    # Use UPX compression if available
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,  # CLI application needs console
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=None,  # Add icon path here if you have one
)
