from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import Optional
import structlog

logger = structlog.get_logger()


@dataclass
class ExecutorResult:
    success: bool
    output: str
    error: str = ""
    files_changed: list = None
    exit_code: int = 0

    def __post_init__(self):
        if self.files_changed is None:
            self.files_changed = []


class BaseExecutor(ABC):
    """所有执行器的抽象基类"""

    name: str = "base"

    def __init__(self, repo_path: str):
        self.repo_path = repo_path
        self.logger = structlog.get_logger().bind(executor=self.name)

    @abstractmethod
    def run(self, task: str, context: Optional[dict] = None) -> ExecutorResult:
        """
        执行任务

        Args:
            task: 自然语言任务描述
            context: 额外上下文（架构设计、前置结果等）

        Returns:
            ExecutorResult
        """
        ...

    def _build_context_prompt(self, context: Optional[dict]) -> str:
        if not context:
            return ""
        parts = []
        if context.get("architecture_plan"):
            parts.append(f"## Architecture Plan\n{context['architecture_plan']}")
        if context.get("project_analysis"):
            parts.append(f"## Project Analysis\n{context['project_analysis']}")
        if context.get("previous_output"):
            parts.append(f"## Previous Output\n{context['previous_output']}")
        return "\n\n".join(parts)

    def health_check(self) -> bool:
        """检查执行器是否可用"""
        return True
