"""`Chained Factories` pattern."""

from dependency_injector import containers, providers


class SqlAlchemyDatabaseService:

    def __init__(self, session, base_class):
        self.session = session
        self.base_class = base_class


class TokensService:

    def __init__(self, id_generator, database):
        self.id_generator = id_generator
        self.database = database


class Token:
    ...


class UsersService:

    def __init__(self, id_generator, database):
        self.id_generator = id_generator
        self.database = database


class User:
    ...


# Sample objects
session = object()
id_generator = object()


class Container(containers.DeclarativeContainer):

    database = providers.Factory(
        SqlAlchemyDatabaseService,
        session=session,
    )

    token_service = providers.Factory(
        TokensService,
        id_generator=id_generator,
        database=providers.Factory(
            database,
            base_class=Token,
        ),
    )

    user_service = providers.Factory(
        UsersService,
        id_generator=id_generator,
        database=providers.Factory(
            database,
            base_class=User,
        ),
    )


if __name__ == '__main__':
    container = Container()

    token_service = container.token_service()
    assert token_service.database.base_class is Token

    user_service = container.user_service()
    assert user_service.database.base_class is User