"""
Асинхронные сервисы для работы с отчетами
"""
import asyncio
import tempfile
import os
import logging
from concurrent.futures import ThreadPoolExecutor
from typing import Optional

from .services import ReportService
from .models import UploadRequest, UploadResult, DataRequest, DataResult
from .ports import StoragePort

logger = logging.getLogger(__name__)


class AsyncReportService:
    """Асинхронный сервис для работы с отчетами"""

    def __init__(self, report_service: ReportService):
        self.report_service = report_service
        self.executor = ThreadPoolExecutor(max_workers=4)

    async def upload_report_async(self, request: UploadRequest) -> UploadResult:
        """Асинхронная загрузка отчета"""
        try:
            # Запускаем синхронную обработку в отдельном потоке
            loop = asyncio.get_event_loop()
            result = await loop.run_in_executor(
                self.executor,
                self._process_upload_sync,
                request
            )
            return result
        except Exception as e:
            logger.error(f"Ошибка при асинхронной загрузке отчета: {str(e)}")
            return UploadResult(
                success=False,
                message=f"Ошибка при асинхронной загрузке отчета: {str(e)}"
            )

    def _process_upload_sync(self, request: UploadRequest) -> UploadResult:
        """Синхронная обработка загрузки (выполняется в отдельном потоке)"""
        return self.report_service.upload_report(request)

    async def get_data_async(self, request: DataRequest) -> DataResult:
        """Асинхронное получение данных"""
        try:
            # Запускаем синхронную обработку в отдельном потоке
            loop = asyncio.get_event_loop()
            result = await loop.run_in_executor(
                self.executor,
                self._process_get_data_sync,
                request
            )
            return result
        except Exception as e:
            logger.error(f"Ошибка при асинхронном получении данных: {str(e)}")
            return DataResult(
                success=False,
                message=f"Ошибка при асинхронном получении данных: {str(e)}"
            )

    def _process_get_data_sync(self, request: DataRequest) -> DataResult:
        """Синхронное получение данных (выполняется в отдельном потоке)"""
        return self.report_service.get_data(request)

    def __del__(self):
        """Очистка ресурсов"""
        if hasattr(self, 'executor'):
            self.executor.shutdown(wait=False)