import uuid

from common_logging import get_logger, log_execution

from .base import JobStatus, TrainingConfig, TrainingPlatform, TrainingResult

logger = get_logger(__name__)


class MockPlatform(TrainingPlatform):

    def __init__(self):
        self.jobs: dict[str, dict] = {}

    @log_execution(logger)
    def create_training_job(self, config: TrainingConfig) -> str:
        job_id = str(uuid.uuid4())
        self.jobs[job_id] = {'config': config, 'progress': 0.0, 'status': 'running', 'checks': 0}
        logger.bind(job_id=job_id).info("Mock training job created")
        return job_id

    def get_job_status(self, job_id: str) -> JobStatus:
        if job_id not in self.jobs:
            raise ValueError(f'Job {job_id} not found')
        job = self.jobs[job_id]
        job['checks'] += 1
        job['progress'] = min(job['checks'] * 10, 100)
        if job['progress'] >= 100:
            job['status'] = 'completed'
            return JobStatus(status='completed', progress=100.0, message='Training completed successfully', logs='Mock training logs')
        return JobStatus(status='running', progress=job['progress'], message=f"Training in progress: {job['progress']}%", logs=f"Mock training logs at {job['progress']}%")

    def get_job_result(self, job_id: str) -> TrainingResult:
        if job_id not in self.jobs:
            raise ValueError(f'Job {job_id} not found')
        job = self.jobs[job_id]
        if job['status'] != 'completed':
            raise ValueError(f'Job {job_id} not completed yet')
        return TrainingResult(model_id=f'mock_model_{job_id[:8]}', metrics={'loss': 0.25, 'accuracy': 0.95}, artifacts={'model_path': f'/mock/models/{job_id}'})

    def cancel_job(self, job_id: str) -> bool:
        if job_id not in self.jobs:
            return False
        self.jobs[job_id]['status'] = 'cancelled'
        logger.bind(job_id=job_id).info("Mock training job cancelled")
        return True
