// 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.baku.toolkit;

import android.test.AndroidTestCase;

import org.joda.time.Duration;

import java.util.concurrent.TimeUnit;

import io.v.android.v23.V;
import io.v.debug.SyncbaseClient;
import io.v.v23.context.VContext;
import lombok.Getter;
import lombok.experimental.Accessors;
import rx.Observable;
import rx.Subscription;
import rx.observables.BlockingObservable;

@Accessors(prefix = "m")
@Getter
public class VAndroidTestCase extends AndroidTestCase {
    private static final long TIMEOUT_SECONDS = 10;
    private static final Duration BLOCKING_DELAY = Duration.millis(250);

    /**
     * Convenience method.
     */
    @SafeVarargs
    public static <T> Observable<T> parallel(final Observable<? extends T>... sources) {
        return Observable.merge(sources);
    }

    /**
     * Convenience method.
     */
    @SafeVarargs
    public static <T> Observable<T> sequence(final Observable<? extends T>... sources) {
        return Observable.concat(Observable.from(sources));
    }

    public static <T> BlockingObservable<T> block(final Observable<T> source) {
        return source.timeout(TIMEOUT_SECONDS, TimeUnit.SECONDS).toBlocking();
    }

    public static <T> T await(final Observable<T> source) {
        return block(source).last();
    }

    public static <T> T first(final Observable<T> source) {
        return block(source).first();
    }

    public static Subscription start(final Observable<?> source) {
        return source.subscribe();
    }

    public static void pause() throws InterruptedException {
        Thread.sleep(BLOCKING_DELAY.getMillis());
    }

    private VContext mVContext;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        mVContext = V.init(getContext());
        V.getPrincipal(mVContext).blessSelf("test");
    }

    @Override
    protected void tearDown() throws Exception {
        // TODO(rosswang): https://github.com/vanadium/issues/issues/809
        // We can't shut down Vanadium because we can't shut down Syncbase. Nothing will fail
        // outright, but operations on subsequent uses of Syncbase will hang indefinitely.
        //V.shutdown();
        super.tearDown();
    }

    public SyncbaseClient createSyncbaseClient() {
        // TODO(rosswang): zero duration after https://github.com/vanadium/issues/issues/809
        return new SyncbaseClient(getContext(), null, true, Duration.standardMinutes(2));
    }
}