package org.apache.cayenne.demo;

import com.fasterxml.jackson.databind.ObjectMapper;
import io.bootique.BQCoreModule;
import io.bootique.BQModuleProvider;
import io.bootique.Bootique;
import io.bootique.cayenne.v42.CayenneModule;
import io.bootique.di.BQModule;
import io.bootique.di.BaseBQModule;
import org.apache.cayenne.configuration.server.ServerModule;
import org.apache.cayenne.demo.model.types.JsonValueType;

public class Application extends BaseBQModule implements BQModuleProvider {

    public static void main(String[] args) {
        Bootique.app(args)
                .args("--config=classpath:config.yml", "-g")
                .module(b -> BQCoreModule.extend(b)
                        .addCommand(GeoTestCommand.class)
                        .addCommand(JsonTestCommand.class)
                )
                .module(b -> CayenneModule.extend(b)
                        .addModule(binder -> binder.bind(ObjectMapper.class).toProviderInstance(ObjectMapper::new))
                        .addModule(binder -> ServerModule.contributeValueObjectTypes(binder).add(JsonValueType.class))
                )
                .autoLoadModules()
                .exec()
                .exit();
    }

    @Override
    public BQModule module() {
        return new Application();
    }

}
