// 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 android.os.Bundle;

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 io.v.rx.syncbase.UserCloudSyncgroup;
import lombok.Getter;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import rx.subscriptions.CompositeSubscription;
import rx.subscriptions.Subscriptions;

/**
 * Backing [mix-in](package-summary.html#mixins) for {@link BakuActivityTrait}. By default, shared
 * state is stored in Syncbase under _app.package.name_/db/ui.
 *
 * Default `Activity` subclasses incorporating this mix-in are available:
 *
 * * {@link BakuActivity} (`extends {@link Activity}`)
 * * {@link BakuAppCompatActivity} (`extends {@link android.support.v7.app.AppCompatActivity}`)
 *
 * Since Java doesn't actually support multiple inheritance, clients requiring custom inheritance
 * hierarchies will need to wire in manually, like any of the examples above. Alternatively, this
 * class may be used via pure composition:
 *
 * ```java
 * public class SampleCompositionActivity extends Activity {
 *     private {@link BakuActivityTrait}<SampleCompositionActivity> mBaku;
 *
 *     {@literal @}Override
 *     protected void onCreate(final Bundle savedInstanceState) {
 *         super.onCreate(savedInstanceState);
 *         setContentView(R.layout.my_activity_layout);
 *
 *         mBaku = new {@link #BakuActivityMixin(Activity, Bundle)
 *             BakuActivityMixin}<>(this, savedInstanceState);
 *
 *         // Example binding between "myDataRow" in Syncbase and myTextView in my_activity_layout.
 *         mBaku.{@link #dataBinder() dataBinder}()
 *              .{@link BindingBuilder#forKey(java.lang.String) forKey}("myDataRow")
 *              .{@link io.v.baku.toolkit.bind.ScalarBindingBuilder#bindTo(int)
 *                  bindTo}(R.id.myTextView);
 *     }
 *
 *     {@literal @}Override
 *     protected void onDestroy() {
 *         mBaku.{@link BakuActivityMixin#close() close}();
 *         super.onDestroy();
 *     }
 * }
 * ```
 *
 * @see io.v.baku.toolkit
 */
@Accessors(prefix = "m")
@Slf4j
public class BakuActivityMixin<T extends Activity> implements BakuActivityTrait<T> {
    @Getter
    private final VAndroidContextTrait<T> mVAndroidContextTrait;

    @Getter
    private final BakuSyncbase mSyncbase;
    @Getter
    private final BakuDb mSyncbaseDb;
    @Getter
    private final BakuTable mSyncbaseTable;
    @Getter
    private final CompositeSubscription mSubscriptions;

    public BakuActivityMixin(final VAndroidContextTrait<T> vAndroidContextTrait) {
        mVAndroidContextTrait = vAndroidContextTrait;

        mSubscriptions = new CompositeSubscription();
        mSyncbase = new BakuSyncbase(this);

        final String app = getSyncbaseAppName(),
                db = getSyncbaseDbName(),
                t = getSyncbaseTableName();
        log.info("Mapping Syncbase path: {}/{}/{}", app, db, t);
        mSyncbaseDb = mSyncbase.rxApp(app).rxDb(db);
        mSyncbaseTable = mSyncbaseDb.rxTable(t);

        joinInitialSyncGroup();
    }

    /**
     * Convenience constructor for compositional integration. For example usage,
     * see the {@linkplain BakuActivityMixin class docs}.
     */
    public BakuActivityMixin(final T context, final Bundle savedInstanceState) {
        this(VAndroidContextMixin.withDefaults(context, savedInstanceState));
        // We have to manage this VAndroidContextTrait since we created it.
        mSubscriptions.add(Subscriptions.create(mVAndroidContextTrait::close));
    }

    @Override
    public void close() {
        mSubscriptions.unsubscribe();
        mSyncbase.close();
    }

    protected String getSyncbaseAppName() {
        return mVAndroidContextTrait.getAndroidContext().getPackageName();
    }

    protected String getSyncbaseDbName() {
        return "db";
    }

    @Override
    public String getSyncbaseTableName() {
        return "ui";
    }

    protected void joinInitialSyncGroup() {
        UserCloudSyncgroup.forActivity(this).join();
    }

    @Override
    public void onSyncError(final Throwable t) {
        ErrorReporters.getDefaultSyncErrorReporter(mVAndroidContextTrait);
    }

    @Override
    public BindingBuilder dataBinder() {
        return new BindingBuilder().activity(this);
    }
}
