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

import com.google.common.collect.ImmutableList;
import com.google.common.reflect.TypeToken;

import java.util.List;

import io.v.rx.syncbase.SingleWatchEvent;
import rx.Observable;
import rx.schedulers.Schedulers;

/**
 * Builder class for data bindings to collections with item IDs derived from a serialized list of
 * IDs persisted as a single Syncbase row. Each item has its own set of data rows identified by
 * those IDs. This kind of ordering allows user-driven reordering of items where the ordering at any
 * time is guaranteed to have been determined by a modifying party. For example, if Alice writes
 * [1, 2, 4] and Bob writes [1, 3, 4], this strategy will resolve the conflict to either [1, 2, 4]
 * or [1, 3, 4], whereas {@linkplain PrefixBindingBuilder prefix bindings} would resolve to either
 * [1, 2, 3, 4] or [1, 3, 2, 4].
 *
 * @see BindingBuilder#forIdList(String)
 */
public class IdListBindingBuilder<A extends RangeAdapter>
        extends CollectionBindingBuilder<IdListBindingBuilder<A>, String, A> {
    private String mIdListRowName;

    public IdListBindingBuilder(final BindingBuilder base) {
        super(base);
    }

    /**
     * This binding will produce lists of row name strings, which the item {@link ViewAdapter} will
     * need to bind to Syncbase rows with {@linkplain ScalarBindingBuilder scalar bindings}.
     */
    public IdListBindingBuilder<A> idListRowName(final String idListRowName) {
        mIdListRowName = idListRowName;
        return this;
    }

    /**
     * This assumes that no IDs are null.
     */
    public Observable<SingleWatchEvent<ImmutableList<String>>> buildIdListWatch() {
        return mBase.mRxTable.watch(mIdListRowName, new TypeToken<List<String>>() {
        }, ImmutableList.of()).map(w -> w.map(ImmutableList::copyOf));
    }

    @Override
    public Observable<IdListAccumulator> buildListAccumulator() {
        return new IdListAccumulator()
                .scanFrom(buildIdListWatch());
    }

    @Override
    public Observable<? extends ListDeltaAccumulator<String>> buildListDeltaAccumulator() {
        return DerivedListDeltaAccumulator.scanFrom(buildListAccumulator()
                .observeOn(Schedulers.computation()), IdListAccumulator::new);
    }
}
