from typing import Any

from .base_workflow import BaseWorkflow, WorkflowStatus, WorkflowStep

from common_logging import get_logger

logger = get_logger(__name__)


class AuditWorkflow(BaseWorkflow):

    def __init__(self, workflow_id: str, tenant_id: int, user_id: int):
        super().__init__(workflow_id, tenant_id, user_id)
        self._init_steps()

    def _init_steps(self):
        self.add_step(WorkflowStep('notice_received', '稽查通知'))
        self.add_step(WorkflowStep('document_preparation', '资料准备'))
        self.add_step(WorkflowStep('response', '应对'))
        self.add_step(WorkflowStep('result_processing', '结果处理'))

    def execute_step(self, step_name: str, data: dict[str, Any]) -> dict[str, Any]:
        step = next((s for s in self.steps if s.name == step_name), None)
        if not step:
            raise ValueError(f'Step {step_name} not found')
        step.status = WorkflowStatus.IN_PROGRESS
        try:
            if step_name == 'notice_received':
                result = self._process_notice(data)
            elif step_name == 'document_preparation':
                result = self._prepare_documents(data)
            elif step_name == 'response':
                result = self._respond(data)
            elif step_name == 'result_processing':
                result = self._process_result(data)
            else:
                raise ValueError(f'Unknown step: {step_name}')
            step.status = WorkflowStatus.COMPLETED
            step.result = result
            return result
        except Exception as e:
            step.status = WorkflowStatus.FAILED
            step.error = str(e)
            logger.error(f'Step {step_name} failed: {e}')
            raise

    def _process_notice(self, data: dict[str, Any]) -> dict[str, Any]:
        return {'status': 'notice_processed', 'notice_id': data.get('notice_id')}

    def _prepare_documents(self, data: dict[str, Any]) -> dict[str, Any]:
        return {'status': 'documents_prepared', 'document_count': len(data.get('documents', []))}

    def _respond(self, data: dict[str, Any]) -> dict[str, Any]:
        return {'status': 'responded', 'response_id': 'resp_001'}

    def _process_result(self, data: dict[str, Any]) -> dict[str, Any]:
        return {'status': 'result_processed', 'outcome': data.get('outcome', 'pending')}
