from typing import Any

from .base_workflow import BaseWorkflow, WorkflowStatus, WorkflowStep

from common_logging import get_logger

logger = get_logger(__name__)


class DeclarationWorkflow(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('data_collection', '数据收集'))
        self.add_step(WorkflowStep('form_generation', '申报表生成'))
        self.add_step(WorkflowStep('review', '审核'))
        self.add_step(WorkflowStep('submission', '提交'))
        self.add_step(WorkflowStep('tracking', '跟踪'))

    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 == 'data_collection':
                result = self._collect_data(data)
            elif step_name == 'form_generation':
                result = self._generate_form(data)
            elif step_name == 'review':
                result = self._review(data)
            elif step_name == 'submission':
                result = self._submit(data)
            elif step_name == 'tracking':
                result = self._track(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 _collect_data(self, data: dict[str, Any]) -> dict[str, Any]:
        return {'status': 'collected', 'data': data}

    def _generate_form(self, data: dict[str, Any]) -> dict[str, Any]:
        return {'status': 'generated', 'form_id': 'form_001'}

    def _review(self, data: dict[str, Any]) -> dict[str, Any]:
        return {'status': 'reviewed', 'approved': True}

    def _submit(self, data: dict[str, Any]) -> dict[str, Any]:
        return {'status': 'submitted', 'submission_id': 'sub_001'}

    def _track(self, data: dict[str, Any]) -> dict[str, Any]:
        return {'status': 'tracking', 'result': 'pending'}
