package io.delphiplatform.api.integration.context.bigtable;

import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.databind.ObjectMapper;

import org.springframework.core.io.support.EncodedResource;

import java.io.IOException;

import io.delphiplatform.api.integration.client.TestBigtableClient;
import io.delphiplatform.api.integration.manager.TestBigtableManager;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public abstract class BigtableTestDataExecutor {

    private final ObjectMapper objectMapper;
    private final TestBigtableClient bigtableClient;
    protected final TestBigtableManager bigtableManager;

    public BigtableTestDataExecutor(TestBigtableManager bigtableManager, TestBigtableClient bigtableClient) {
        this.bigtableManager = bigtableManager;
        this.bigtableClient = bigtableClient;

        ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
        mapper.configure(Feature.ALLOW_COMMENTS, true);

        this.objectMapper = mapper;
    }

    abstract public void populate(EncodedResource encodedResource);

    abstract public String getTableName();

    public void reCreateTable() {
        bigtableClient.reCreateTable(getTableName());
    }

    protected <T> T readRows(EncodedResource encodedResource, Class<T> tClass) {
        try {
            return objectMapper.readValue(encodedResource.getInputStream(), tClass);
        } catch (IOException e) {
            log.error(String.format("Fail to retrieve Bigtable resource named '%s'", getTableName()), e);
            throw new RuntimeException(e);
        }
    }
}
