// 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.syncbase.v23.services.syncbase.nosql;

import com.google.common.collect.AbstractIterator;

import java.io.EOFException;
import java.util.Iterator;
import java.util.List;

import io.v.v23.context.CancelableVContext;
import io.v.v23.vdl.TypedClientStream;
import io.v.v23.vdl.VdlAny;
import io.v.v23.verror.VException;

class ResultStreamImpl implements ResultStream {
    private final CancelableVContext ctxC;
    private final TypedClientStream<Void, List<VdlAny>, Void> stream;
    private final String[] columnNames;
    private volatile boolean isCanceled;
    private volatile boolean isCreated;

    ResultStreamImpl(CancelableVContext ctxC, TypedClientStream<Void, List<VdlAny>, Void> stream,
            String[] columnNames) {
        this.ctxC = ctxC;
        this.stream = stream;
        this.columnNames = columnNames;
        this.isCanceled = this.isCreated = false;
    }
    // Implements Iterable.
    @Override
    public synchronized Iterator<VdlAny[]> iterator() {
        if (this.isCreated) {
            throw new RuntimeException("Can only create one ResultStream iterator.");
        }
        this.isCreated = true;
        return new AbstractIterator<VdlAny[]>() {
            @Override
            protected VdlAny[] computeNext() {
                synchronized (ResultStreamImpl.this) {
                    if (ResultStreamImpl.this.isCanceled) {  // client canceled the stream
                        return endOfData();
                    }
                    try {
                        List<VdlAny> result = ResultStreamImpl.this.stream.recv();
                        return result.toArray(new VdlAny[result.size()]);
                    } catch (EOFException e) {  // legitimate end of stream
                        return endOfData();
                    } catch (VException e) {
                        throw new RuntimeException("Error retrieving next stream element.", e);
                    }
                }
            }
        };
    }

    // Implements ResultStream.
    @Override
    public String[] columnNames() {
        return this.columnNames;
    }
    @Override
    public synchronized void cancel() throws VException {
        this.isCanceled = true;
        this.stream.finish();
    }
}
