package io.github.vmzakharov.ecdataframe.dataframe;

import io.github.vmzakharov.ecdataframe.dsl.value.DateValue;
import io.github.vmzakharov.ecdataframe.dsl.value.Value;
import io.github.vmzakharov.ecdataframe.dsl.value.ValueType;
import org.eclipse.collections.api.list.ImmutableList;
import org.eclipse.collections.api.list.ListIterable;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

abstract public class DfDateColumn
extends DfColumnAbstract
{
    private DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
    public DfDateColumn(DataFrame newDataFrame, String newName)
    {
        super(newDataFrame, newName);
    }

    abstract public LocalDate getDate(int rowIndex);

    @Override
    public String getValueAsString(int rowIndex)
    {
        LocalDate value = this.getDate(rowIndex);
        return value == null ? "" : this.formatter.format(value);
    }

    @Override
    public String getValueAsStringLiteral(int rowIndex)
    {
        return this.getValueAsString(rowIndex);
    }

    @Override
    public Object getObject(int rowIndex)
    {
        return this.getDate(rowIndex);
    }

    @Override
    public Value getValue(int rowIndex)
    {
        return new DateValue(this.getDate(rowIndex));
    }

    public abstract ImmutableList<LocalDate> toList();

    public ValueType getType()
    {
        return ValueType.DATE;
    }

    @Override
    public void addRowToColumn(int rowIndex, DfColumn target)
    {
        ((DfDateColumnStored) target).addDate(this.getDate(rowIndex));
    }

    protected abstract void addAllItems(ListIterable<LocalDate> items);

    @Override
    public DfColumn mergeWithInto(DfColumn other, DataFrame target)
    {
        DfDateColumn mergedCol = (DfDateColumn) this.validateAndCreateTargetColumn(other, target);

        mergedCol.addAllItems(this.toList());
        mergedCol.addAllItems(((DfDateColumn) other).toList());
        return mergedCol;
    }
}