import asyncio
from os import getenv

import db
import util
from processing import process

KEYNAME = "queue"

# Chunk size
CHUNK_SIZE = int(getenv("MONOLITH_INGEST_CHUNK_SIZE", "900"))
ITER_DELAY = float(getenv("MONOLITH_INGEST_ITER_DELAY", "0.5"))

log = util.get_logger("ingest")


class Ingest(object):
    def __init__(self):
        name = self.__class__.__name__
        self.log = util.get_logger(name)
        self.current_chunk = 0
        self.log.info(
            (
                "Starting ingest handler for chunk size of "
                f"{CHUNK_SIZE} every {ITER_DELAY} seconds."
            )
        )

    async def run(self):
        while True:
            await self.get_chunk()
            self.log.debug(f"Ingest chunk {self.current_chunk} complete")
            self.current_chunk += 1
            await asyncio.sleep(ITER_DELAY)

    async def get_chunk(self):
        length = await db.ar.llen(KEYNAME)
        if length > CHUNK_SIZE:
            length = CHUNK_SIZE
        if not length:
            return
        await process.spawn_processing_threads(self.current_chunk, length)
