package org.wikipedia.database.column;

import android.database.Cursor;
import android.support.annotation.NonNull;

public abstract class Column<T> {
    private final String tbl;
    @NonNull private final String name;
    @NonNull private final String type;

    /**
     * @param name Column name.
     * @param type SQLite datatype and constraints.
     */
    public Column(@NonNull String tbl, @NonNull String name, @NonNull String type) {
        this.tbl = tbl;
        this.name = name;
        this.type = type;
    }

    @NonNull
    public String getName() {
        return name;
    }

    @NonNull public String qualifiedName() {
        return tbl + '.' + name;
    }

    @NonNull
    public String getType() {
        return type;
    }

    // TODO: add ContentValues marshalling method and hide getName().
    public abstract T val(@NonNull Cursor cursor);

    // TODO: it would be more convenient in more places to just return the qualified name. It's
    //       easy to accidentally implicitly convert a Column to a String with `+ ""` and it's only
    //       appropriate to do so when creating or altering tables which occurs less frequently than
    //       actually using them.
    @Override
    public String toString() {
        return getName() + " " + getType();
    }

    protected int getInt(@NonNull Cursor cursor) {
        return cursor.getInt(getIndex(cursor));
    }

    protected long getLong(@NonNull Cursor cursor) {
        return cursor.getLong(getIndex(cursor));
    }

    protected String getString(@NonNull Cursor cursor) {
        return cursor.getString(getIndex(cursor));
    }

    protected int getIndex(@NonNull Cursor cursor) {
        return cursor.getColumnIndexOrThrow(getName());
    }
}
