// 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.hellobaku;

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;

import io.v.baku.toolkit.VAndroidContextMixin;
import io.v.baku.toolkit.VAndroidContextTrait;
import io.v.baku.toolkit.bind.BindingBuilder;
import io.v.rx.syncbase.RxAndroidSyncbase;
import io.v.rx.syncbase.RxDb;
import io.v.rx.syncbase.UserSyncgroup;
import rx.Subscription;

public class HelloActivityALaCarte extends Activity {
    private RxAndroidSyncbase mSb;
    private Subscription mActivityDataBindings;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello);

        final VAndroidContextTrait<HelloActivityALaCarte> vActivity =
                VAndroidContextMixin.withDefaults(this, savedInstanceState);

        mSb = new RxAndroidSyncbase(vActivity);
        // Operate on Syncbase io.v.baku.hellobaku/db/t
        final RxDb db = mSb.rxApp(getPackageName()).rxDb("db");

        final TextView txtOutput = (TextView) findViewById(R.id.displayTextView);

        // We want this data binding to share the lifecycle of the Activity from onCreate to
        // onDestroy, so keep track of its Subscription and unsubscribe in onDestroy.
        final BindingBuilder builder = new BindingBuilder()
                .activity(vActivity)
                .rxTable(db.rxTable("t"));

        mActivityDataBindings = builder.getAllBindings();

        // Binds the Syncbase row named "message" to displayTextView, a.k.a. txtOutput.
        builder.forKey("message")
               .bindTo(txtOutput);

        final EditText txtInput = (EditText) findViewById(R.id.inputEditText);
        findViewById(R.id.actionButton).setOnClickListener(bn -> {
            // Setting the text on txtOutput will update the "message" Syncbase row via the data
            // binding we established above.
            txtOutput.setText(txtInput.getText());
            txtInput.setText("");
        });

        UserSyncgroup.builder()
                .activity(vActivity)
                .db(db)
                .prefix("t")
                .sgSuffix("myGlobalUserSyncgroup")
                .buildCloud()
                .join();
    }

    @Override
    protected void onDestroy() {
        mActivityDataBindings.unsubscribe();
        mSb.close();
        super.onDestroy();
    }
}
