"""Containers module."""

from dependency_injector import containers, providers

from .services import ConfigService


class Core(containers.DeclarativeContainer):
    config = providers.Configuration('config')


class Storage(containers.DeclarativeContainer):
    queue = providers.Singleton(lambda: 'Some storage')


class Adapter(containers.DeclarativeContainer):
    core = providers.DependenciesContainer(config=providers.Configuration())
    tinydb = providers.Singleton(
        lambda db_path: f'DB Path=[{db_path}]',
        db_path=core.config.default.db_path,
    )


class Repository(containers.DeclarativeContainer):
    adapter = providers.DependenciesContainer()
    storage = providers.DependenciesContainer()
    site = providers.Singleton(
        lambda adapter, queue: f'Adapter=[{adapter}], queue=[{queue}]',
        adapter=adapter.tinydb,
        queue=storage.queue,
    )


class Service(containers.DeclarativeContainer):
    core = providers.DependenciesContainer()
    config = providers.Singleton(ConfigService, core.config.provider)


class Application(containers.DeclarativeContainer):

    core = providers.Container(Core)
    storage = providers.Container(Storage)
    adapter = providers.Container(Adapter, core=core)
    repository = providers.Container(Repository, adapter=adapter, storage=storage)
    service = providers.Container(Service, core=core)
