/*
 * Copyright (C) 2016 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.android.tv.dvr.ui.browse;

import android.os.Bundle;
import android.support.v17.leanback.app.DetailsFragment;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.TextAppearanceSpan;

import com.android.tv.R;
import com.android.tv.TvApplication;
import com.android.tv.data.Channel;
import com.android.tv.dvr.data.ScheduledRecording;

/**
 * {@link DetailsFragment} for recordings in DVR.
 */
abstract class RecordingDetailsFragment extends DvrDetailsFragment {
    private ScheduledRecording mRecording;

    @Override
    protected void onCreateInternal() {
        setDetailsOverviewRow(createDetailsContent());
    }

    @Override
    protected boolean onLoadRecordingDetails(Bundle args) {
        long scheduledRecordingId = args.getLong(DvrDetailsActivity.RECORDING_ID);
        mRecording = TvApplication.getSingletons(getContext()).getDvrDataManager()
                .getScheduledRecording(scheduledRecordingId);
        return mRecording != null;
    }

    /**
     * Returns {@link ScheduledRecording} for the current fragment.
     */
    public ScheduledRecording getRecording() {
        return mRecording;
    }

    private DetailsContent createDetailsContent() {
        Channel channel = TvApplication.getSingletons(getContext()).getChannelDataManager()
                .getChannel(mRecording.getChannelId());
        SpannableString title = mRecording.getProgramTitleWithEpisodeNumber(getContext()) == null ?
                null : new SpannableString(mRecording
                .getProgramTitleWithEpisodeNumber(getContext()));
        if (TextUtils.isEmpty(title)) {
            title = new SpannableString(channel != null ? channel.getDisplayName()
                    : getContext().getResources().getString(
                    R.string.no_program_information));
        } else {
            String programTitle = mRecording.getProgramTitle();
            title.setSpan(new TextAppearanceSpan(getContext(),
                    R.style.text_appearance_card_view_episode_number), programTitle == null ? 0
                    : programTitle.length(), title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        String description = !TextUtils.isEmpty(mRecording.getProgramDescription()) ?
                mRecording.getProgramDescription() :  mRecording.getProgramLongDescription();
        if (TextUtils.isEmpty(description)) {
            description = channel != null ? channel.getDescription() : null;
        }
        return new DetailsContent.Builder()
                .setTitle(title)
                .setStartTimeUtcMillis(mRecording.getStartTimeMs())
                .setEndTimeUtcMillis(mRecording.getEndTimeMs())
                .setDescription(description)
                .setImageUris(mRecording.getProgramPosterArtUri(),
                        mRecording.getProgramThumbnailUri(), channel)
                .build();
    }
}
