"""Worker process entrypoint.

Usage:
    python -m app.workers.runner download 0
    python -m app.workers.runner analyze 0
    python -m app.workers.runner embed 0
    python -m app.workers.runner notify 0
"""
from __future__ import annotations

import asyncio
import sys

import redis.asyncio as aioredis

from app.config import get_settings
from app.logging_config import configure_logging
from app.services.ai import AIService
from app.services.downloader import DownloaderService
from app.services.queue import QueueService
from app.services.storage import StorageService


async def run(worker_type: str, worker_id: int) -> None:
    settings = get_settings()
    configure_logging(settings.log_level, settings.log_format)

    redis_client = aioredis.from_url(
        settings.redis_url.get_secret_value(),
        decode_responses=True,
    )
    queue = QueueService(redis_client)
    await queue.ensure_consumer_groups()

    if worker_type == "download":
        from app.workers.tasks.download import DownloadWorker
        storage = StorageService(settings)
        downloader = DownloaderService(settings)
        worker = DownloadWorker(redis_client, queue, storage, downloader, worker_id=worker_id)

    elif worker_type == "analyze":
        from app.workers.tasks.analyze import AnalyzeWorker
        ai = AIService(settings)
        worker = AnalyzeWorker(redis_client, queue, ai, worker_id=worker_id)

    elif worker_type == "embed":
        from app.workers.tasks.embed import EmbedWorker
        ai = AIService(settings)
        worker = EmbedWorker(redis_client, queue, ai, worker_id=worker_id)

    elif worker_type == "notify":
        from app.workers.tasks.notify import NotifyWorker
        bot_token = settings.telegram_bot_token.get_secret_value()
        worker = NotifyWorker(redis_client, queue, bot_token, worker_id=worker_id)

    else:
        raise ValueError(f"Unknown worker type: {worker_type}")

    try:
        await worker.start()
    finally:
        await redis_client.aclose()


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python -m app.workers.runner <type> [worker_id]")
        sys.exit(1)
    wtype = sys.argv[1]
    wid = int(sys.argv[2]) if len(sys.argv) > 2 else 0
    asyncio.run(run(wtype, wid))
