import { ConfigParams, DependencyResolver, Descriptor, IConfigurable, IReferenceable, IReferences, References } from "pip-services3-commons-nodex";
import { DirectClient } from "pip-services3-rpc-nodex";


export async function main() {
    // Instantiation
    let myController = new MyController();

    // Instantiation
    let client = new MyDirectClient();

    // Reference setting
    client.setReferences(References.fromTuples(
        new Descriptor("pip-services", "controller", "controller", "default", "1.0"), myController));
    
    // Calling "my_method"
    client.myMethod();
}

export class MyDirectClient extends DirectClient<MyController> {
    _dependencyResolver =  new DependencyResolver();

    public constructor() {
        super();
        this._controller = null
        this._dependencyResolver.put("controller", new Descriptor("pip-services", "controller", "*", "*", "1.0"))
    }

    public setReferences(references: IReferences): void {
        this._dependencyResolver.setReferences(references);
        this._controller = this._dependencyResolver.getOneRequired("controller");
    }

    public myMethod(): void {
        this._controller.myMethod();
    }
}


export class MyController implements IConfigurable, IReferenceable {
    public configure(config: ConfigParams): void {
    }

    public setReferences(references: IReferences): void {
    }

    public myMethod(): void {
        console.log('Hello world');
    }
}