"""Complex example of the injecting of provided instance attributes and items."""

from dependency_injector import containers, providers


class Service:

    def __init__(self, value):
        self.value = value

    def get_value(self):
        return self.value


class Container(containers.DeclarativeContainer):

    service = providers.Singleton(Service, value=42)

    dependency = providers.Object(
        {
            'foo': {
                'bar': 10,
                'baz': lambda arg: {'arg': arg}
            },
        },
    )

    demo_list = providers.List(
        dependency.provided['foo']['bar'],
        dependency.provided['foo']['baz'].call(22)['arg'],
        dependency.provided['foo']['baz'].call(service)['arg'],
        dependency.provided['foo']['baz'].call(service)['arg'].value,
        dependency.provided['foo']['baz'].call(service)['arg'].get_value.call(),
    )


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

    assert container.demo_list() == [
        10,
        22,
        container.service(),
        42,
        42,
    ]