/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License
 */

package com.google.android.tv.partner.support;

import android.content.ContentValues;
import com.google.auto.value.AutoValue;

/**
 * Value class representing a TV Input that uses TV app EPG.
 *
 * @see {@link EpgContract.EpgInputs}
 */
@AutoValue
public abstract class EpgInput {

    public static EpgInput createEpgChannel(long id, String inputId, String lineupId) {
        return new AutoValue_EpgInput(id, inputId, lineupId);
    }

    public static EpgInput createEpgChannel(ContentValues contentValues) {
        long id = contentValues.getAsLong(EpgContract.EpgInputs.COLUMN_ID);
        String inputId = contentValues.getAsString(EpgContract.EpgInputs.COLUMN_INPUT_ID);
        String lineupId = contentValues.getAsString(EpgContract.EpgInputs.COLUMN_LINEUP_ID);
        return createEpgChannel(id, inputId, lineupId);
    }

    /** The unique ID for a row. */
    public abstract long getId();

    /**
     * The ID of the TV input service that provides this TV channel.
     *
     * <p>Use {@link android.media.tv.TvContract#buildInputId} to build the ID.
     */
    public abstract String getInputId();

    /**
     * The line up id.
     *
     * <p>This is a opaque string that should not be parsed.
     */
    public abstract String getLineupId();

    public final ContentValues toContentValues() {
        ContentValues contentValues = new ContentValues();
        contentValues.put(EpgContract.EpgInputs.COLUMN_ID, getId());
        contentValues.put(EpgContract.EpgInputs.COLUMN_INPUT_ID, getInputId());
        contentValues.put(EpgContract.EpgInputs.COLUMN_LINEUP_ID, getLineupId());
        return contentValues;
    }
}
