package io.delphiplatform.api.v3.bigtable;

import com.google.cloud.bigtable.data.v2.models.Row;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

import io.delphiplatform.api.v3.bigtable.reader.BigtableEntityReader;
import io.delphiplatform.api.v3.bigtable.reader.BigtableEntityReader.EntityReadingParams;

@Service
public class BigtableRowReader {

    private final Map<Class<?>, BigtableEntityReader<?>> readers;

    @Autowired
    public BigtableRowReader(List<BigtableEntityReader<?>> entityReaders) {
        Builder<Class<?>, BigtableEntityReader<?>> mapBuilder = ImmutableMap.builder();
        entityReaders.forEach(reader -> mapBuilder.put(reader.getParsedClass(), reader));
        readers = mapBuilder.build();
    }

    public <T> T readRow(Class<T> classToParse, Row row) {
        BigtableEntityReader<T> bigTableEntityReader = (BigtableEntityReader<T>) readers.get(classToParse);
        return bigTableEntityReader.readRow(row);
    }

    public <T> Stream<T> readRows(Class<T> classToParse, Stream<Row> rowsStream) {
        BigtableEntityReader<T> bigTableEntityReader = (BigtableEntityReader<T>) readers.get(classToParse);
        return bigTableEntityReader.readRows(rowsStream);
    }

    public <T> Stream<T> readRows(Class<T> classToParse, Stream<Row> rowsStream, EnumSet<EntityReadingParams> params) {
        BigtableEntityReader<T> bigTableEntityReader = (BigtableEntityReader<T>) readers.get(classToParse);
        return bigTableEntityReader.readRows(rowsStream, params);
    }
}
