# You need a .env file in the root of the project.

set dotenv-path := "../../.env"
set dotenv-required := false
set dotenv-load := true

help:
    just -l

# Run all gates: test with coverage + check-source + build
check: test-cov check-source build

# Run unit tests
test *args:
    SG_ENV=test PYTHONUNBUFFERED=1 uv run pytest -s -n auto -m "not e2e" {{ args }}

# Run E2E tests
test-e2e *args:
    SG_ENV=test PYTHONUNBUFFERED=1 uv run pytest -s -n auto -m e2e {{ args }}

# Run all tests (unit + e2e)
test-all *args:
    SG_ENV=test PYTHONUNBUFFERED=1 uv run pytest -s -n auto {{ args }}

# Run unit tests with coverage (fail_under configured in pyproject.toml)
test-cov *args:
    SG_ENV=test PYTHONUNBUFFERED=1 uv run pytest -s --cov --cov-report=term-missing -n auto -m "not e2e" {{ args }}

alias cs := check-source

check-source:
    uv run ruff format --check && uv run ruff check && uv run ty check --error-on-warning

alias fs := fix-source

alias fix := fix-source

fix-source:
    uv run ruff check --fix
    uv run ruff format
    just check-source

# Build sdist + wheel from clean state and verify critical files
build:
    rm -rf dist/ build/ *.egg-info
    uv build
    @echo "--- Verifying wheel contents ---"
    @uv run python -c "\
    import zipfile, sys, glob; \
    whl = glob.glob('dist/sec_gemini-*.whl')[0]; \
    names = zipfile.ZipFile(whl).namelist(); \
    required = [ \
        'sec_gemini/api_pb2.py', \
        'sec_gemini/api_pb2_grpc.py', \
        'sec_gemini/byot/__init__.py', \
        'sec_gemini/byot/byot_api_pb2.py', \
        'sec_gemini/byot/byot_api_pb2_grpc.py', \
        'sec_gemini/byot/client.py', \
        'sec_gemini/byot/cli.py', \
        'sec_gemini/byot/service.py', \
        'sec_gemini/tools/__init__.py', \
        'sec_gemini/tools/file_ops.py', \
        'sec_gemini/tools/shell.py', \
        'sec_gemini/tools/network.py', \
        'sec_gemini/tools/safety.py', \
    ]; \
    missing = [f for f in required if f not in names]; \
    print(f'Checked {len(required)} required files in {whl}'); \
    [print(f'  MISSING: {f}') for f in missing]; \
    sys.exit(1) if missing else print('All required files present.') \
    "

# Clean build artifacts
clean:
    rm -rf dist/ build/ *.egg-info .coverage .pytest_cache
    find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true

# Regenerate proto files
proto:
    ./bin/update_proto.sh

# Run the TUI
alias tui := sec-gemini

sec-gemini *args:
    uv run sec-gemini {{ args }}

byot *args:
  uv run sec-gemini-byot {{ args }}

# Run production tests
test-production *args:
    PYTHONUNBUFFERED=1 uv run code_examples/demo_simple.py

# Run production logging suppression tests
test-logging-suppression *args:
    PYTHONUNBUFFERED=1 uv run code_examples/verify_logging_suppression.py {{ args }}

# --- Demos ---

demo-complete:
    PYTHONUNBUFFERED=1 uv run code_examples/demo_complete.py

demo-files:
    PYTHONUNBUFFERED=1 uv run code_examples/demo_files.py

demo-simple:
    PYTHONUNBUFFERED=1 uv run code_examples/demo_simple.py

demo-mcps:
    PYTHONUNBUFFERED=1 uv run code_examples/demo_mcps.py

demo-skills:
    PYTHONUNBUFFERED=1 uv run code_examples/demo_skills.py

demo-cybergym:
    PYTHONUNBUFFERED=1 uv run code_examples/demo_cybergym.py

demo-cpg:
    PYTHONUNBUFFERED=1 uv run code_examples/demo_code_property_graph.py
