// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.mojo.discovery;

import android.content.Context;

import org.chromium.mojo.application.ApplicationConnection;
import org.chromium.mojo.application.ApplicationDelegate;
import org.chromium.mojo.application.ApplicationRunner;
import org.chromium.mojo.application.ServiceFactoryBinder;
import org.chromium.mojo.bindings.InterfaceRequest;
import org.chromium.mojo.system.Core;
import org.chromium.mojo.system.MessagePipeHandle;
import org.chromium.mojom.mojo.Shell;

import io.v.android.v23.V;
import io.v.v23.context.VContext;

/**
 * A mojo app that eposes  the v23 discovery api through the i.v.mojo.discovery interface.
 */
public class VDiscoveryApp implements ApplicationDelegate {

    private final VContext rootCtx;

    VDiscoveryApp(Context context) {
        rootCtx = V.init(context);
    }

    @Override
    public void initialize(Shell shell, String[] strings, String s) {}

    @Override
    public boolean configureIncomingConnection(ApplicationConnection applicationConnection) {
        applicationConnection.addService(new ServiceFactoryBinder<Discovery>() {
            @Override
            public void bind(InterfaceRequest<Discovery> request) {
                Discovery.MANAGER.bind(new DiscoveryImpl(V.getDiscovery(rootCtx), rootCtx),
                        request);
            }

            @Override
            public String getInterfaceName() {
                return Discovery.MANAGER.getName();
            }
        });
        return true;
    }

    @Override
    public void quit() {
        rootCtx.cancel();
    }

    public static void mojoMain(Context context, Core core,
                                MessagePipeHandle applicationRequestHandle) {
        ApplicationRunner.run(new VDiscoveryApp(context), core, applicationRequestHandle);
    }
}
