/* eslint max-classes-per-file: ["error", 20] */
import { describe, it } from "mocha";
import { Container } from "../Container";
import { fluent } from "../traits";

class Foo {
    foo = "foo";
}

class Bar {
    bar = "bar";

    constructor(foo?: () => Foo) { }
}

interface Services {
    foo: Foo;

    bar?: Bar;

    baz: Foo;
}

interface ServicesB {
    // will give errors
    // baz: Bar;

    baz: Foo;

    zoo?: Foo;
}

interface SharedServices {
    foo: Foo;

    bar?: Bar;

    baz: Bar;
}

const config = fluent()
    .declare<Services>()
    .declare<ServicesB>()
    .register({
        bar: it => it
            .lifetime("context") // тип активации, время жизни
            .wants({
                zoo: "zoo", // зависимость

                zoo$: { name: "zoo", lazy: true } // отложенная активация, 
                //фабричный метод
            })
            .factory(({ zoo$ }) => // фабрика получает объект с именованными зависимостями
                // удобно для деструктурирования
                new Bar(zoo$) // создается экземпляр сервиса
            ),
        foo: it => it.factory(() => new Foo()),
        baz: it => it.value(new Foo())
    })
    .done({});

declare const container: Container<Record<string, never>>;
const c2 = config.apply(container);

c2.resolve("foo");