"""
Cookbook Recipe: Google Gemini Function Calling Guard
======================================================
Demonstrates guarding Google Gemini function calls with Ed25519 cryptographic
signatures and AST verification.

Run:
    python cookbook/being_built/gemini_function_calling_guard.py
"""

import sys
import os
import json
from typing import Dict, Any

# Add repository root to sys.path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")))

from src.polyglot_ast_validator import PolyglotASTValidator
from src.trust_protocol import BartholomewTrustAuthority


class GeminiToolGuard:
    """Interception wrapper for Google Gemini function calls."""

    def __init__(self, trust_authority: BartholomewTrustAuthority):
        self.auth = trust_authority

    def process_function_call(self, func_name: str, func_args: Dict[str, Any]) -> Dict[str, Any]:
        """
        Validates function calls generated by Gemini models.
        """
        # 1. AST Validation
        for k, v in func_args.items():
            if isinstance(v, str):
                is_safe, msg, _ = PolyglotASTValidator.validate_code(v)
                if not is_safe:
                    return {
                        "name": func_name,
                        "response": {
                            "status": "VETOED",
                            "error": f"BTP-VETO on argument '{k}': {msg}"
                        }
                    }

        # 2. Cryptographic Attestation
        receipt = self.auth.evaluate_intent(
            "Gemini-Pro-Agent",
            "GEMINI_FUNC_CALL",
            {"tool": func_name, "args": func_args}
        )

        return {
            "name": func_name,
            "response": {
                "status": "APPROVED",
                "result": f"Executed function '{func_name}'",
                "btp_receipt_signature": receipt.get("signature")
            }
        }


def main():
    print("=" * 75)
    print("  BTP Global Cookbook: Google Gemini Function Calling Guard Demo")
    print("=" * 75)

    auth = BartholomewTrustAuthority(ttl_seconds=300)
    guard = GeminiToolGuard(trust_authority=auth)

    # 1. Safe Gemini function call
    print("\n--- [1] Processing Legitimate Gemini Function Call ---")
    safe_call = guard.process_function_call(
        func_name="generate_quarterly_report",
        func_args={"format": "pdf", "fiscal_year": 2026}
    )
    print(f"Gemini Response: {safe_call['response']['status']}")
    assert safe_call["response"]["status"] == "APPROVED"
    assert "btp_receipt_signature" in safe_call["response"]

    # 2. Injected command argument
    print("\n--- [2] Intercepting Malicious Argument in Gemini Call ---")
    malicious_call = guard.process_function_call(
        func_name="execute_custom_pipeline",
        func_args={"script": "import os; os.system('rm -rf /')"}
    )
    print(f"Gemini Response: {malicious_call['response']['status']}")
    print(f"Error: {malicious_call['response']['error']}")
    assert malicious_call["response"]["status"] == "VETOED"

    print("\n" + "=" * 75)
    print("  Gemini Function Guard Complete: Verified Attestations Emitted")
    print("=" * 75)
    return True


if __name__ == "__main__":
    main()
