from typing import Optional
import structlog

from .base_executor import BaseExecutor, ExecutorResult
from app.configs import settings

logger = structlog.get_logger()


class GeminiExecutor(BaseExecutor):
    """
    Google Gemini 执行器
    使用 google-generativeai SDK 执行任务
    """

    name = "gemini"

    def __init__(self, repo_path: str):
        super().__init__(repo_path)
        self._setup_client()

    def _setup_client(self):
        try:
            import google.generativeai as genai
            genai.configure(api_key=settings.google_api_key)
            self.model = genai.GenerativeModel(
                model_name="gemini-2.0-flash-exp",
                system_instruction=(
                    "You are an expert software engineer. "
                    "When given a task, implement it fully with clean, tested, production-quality code."
                ),
            )
            self.genai = genai
            self.logger.info("Gemini client initialized")
        except ImportError:
            self.model = None
            self.genai = None
            self.logger.warning("google-generativeai package not installed")

    def run(self, task: str, context: Optional[dict] = None) -> ExecutorResult:
        self.logger.info("Gemini executor running task", task=task[:100])

        if not self.model:
            return ExecutorResult(
                success=False,
                output="",
                error="Gemini client not initialized. Install google-generativeai and set GOOGLE_API_KEY.",
            )

        context_prompt = self._build_context_prompt(context)
        full_prompt = f"{context_prompt}\n\n{task}" if context_prompt else task

        try:
            response = self.model.generate_content(full_prompt)
            return ExecutorResult(
                success=True,
                output=response.text,
            )
        except Exception as e:
            return ExecutorResult(success=False, output="", error=str(e))

    def health_check(self) -> bool:
        return self.model is not None and bool(settings.google_api_key)
