// 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.app.Activity;

import io.v.baku.toolkit.bind.BindingBuilder;
import io.v.baku.toolkit.syncbase.BakuDb;
import io.v.baku.toolkit.syncbase.BakuSyncbase;
import io.v.baku.toolkit.syncbase.BakuTable;
import rx.subscriptions.CompositeSubscription;

/**
 * [Trait](package-summary.html#mixins) for activities with distributed UI state. This trait is
 * implemented by {@link BakuActivityMixin}.
 *
 * For any UI widget that should have distributed state, the application should build data bindings
 * by chaining methods from a {@link #dataBinder()} call, binding shared data fields in the Syncbase
 * distributed storage system to UI widget properties. Writes can be performed directly via
 * {@link #getSyncbaseTable()}`.`{@link io.v.baku.toolkit.syncbase.BakuTable#put(java.lang.String,
 * java.lang.Object) put(key, value)}. For two-way scalar bindings, writes can also be performed by
 * modifying the widget directly. More information about data bindings is available in the
 * {@link io.v.baku.toolkit.bind} package documentation.
 *
 * Implementations create a Syncbase table to use by default for data binding, and create and manage
 * a default {@linkplain io.v.rx.syncbase.UserCloudSyncgroup global user-level cloud syncgroup} to
 * sync distributed data across all instances of the application belonging to a user.
 */
public interface BakuActivityTrait<T extends Activity> extends AutoCloseable {
    VAndroidContextTrait<T> getVAndroidContextTrait();
    BakuSyncbase getSyncbase();
    BakuDb getSyncbaseDb();

    /**
     * Gets a wrapper for the Syncbase table, allowing for direct write operations. The wrapper
     * includes {@link #onSyncError(Throwable)} as a default error handler for any actions that are
     * not explicitly subscribed to, making write operations easier to use.
     *
     * Example usage:
     *
     * ```java
     * getSyncbaseTable().{@link BakuTable#put(String, Object) put}("myKey", myValue);
     * ```
     */
    BakuTable getSyncbaseTable();
    CompositeSubscription getSubscriptions();
    String getSyncbaseTableName();
    void onSyncError(Throwable t);

    /**
     * Exposes a default binding builder for this Activity. The returned builder may be freely
     * customized; a new builder is returned for each call.
     *
     * Example usage:
     *
     * ```java
     * dataBinder().{@link BindingBuilder#forKey(java.lang.String) forKey}("myDataRow")
     *             .{@link io.v.baku.toolkit.bind.ScalarBindingBuilder#bindTo(int)
     *             bindTo}(R.id.myTextView);
     * ```
     */
    BindingBuilder dataBinder();

    /**
     * Unsubscribes all data bindings associated with this activity and releases the local Syncbase
     * instance.
     *
     * @see BakuSyncbase#close()
     */
    void close();
}
