from typing import (
    Any,
    AsyncIterable,
    Iterable,
)

from aiokit import AioRootThing
from izihawa_utils.importlib import import_object

from ..sinks.base import BaseSink


class BaseJob(AioRootThing):
    name = None

    def __init__(self, actions: Iterable[dict], sinks: Iterable[dict]):
        super().__init__()
        real_sinks = []
        for sink in sinks:
            if isinstance(sink, BaseSink):
                real_sinks.append(sink)
            else:
                real_sinks.append(import_object(sink['class'])(**sink.get('kwargs', {})))
        self.sinks = real_sinks

        real_actions = []
        for action in actions:
            real_actions.append(import_object(action['class'])(**action.get('kwargs', {})))
        self.actions = real_actions

        self.waits.extend(self.sinks)
        self.waits.extend(self.actions)

    async def iterator(self) -> AsyncIterable[Any]:
        raise NotImplementedError()

    async def action_iterator(self) -> AsyncIterable[Any]:
        async for item in self.iterator():
            processed_item = item
            for action in self.actions:
                processed_item = await action.do(processed_item)
            yield processed_item

    async def start(self):
        async for data in self.action_iterator():
            for sink in self.sinks:
                await sink.send(data)
