/*
 * 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.media.tv.TvContract;
import android.support.annotation.Nullable;
import android.text.TextUtils;

import com.android.tv.data.BaseProgram;
import com.android.tv.data.Channel;

/**
 * A class for details content.
 */
class DetailsContent {
    /** Constant for invalid time. */
    public static final long INVALID_TIME = -1;

    private CharSequence mTitle;
    private long mStartTimeUtcMillis;
    private long mEndTimeUtcMillis;
    private String mDescription;
    private String mLogoImageUri;
    private String mBackgroundImageUri;

    private DetailsContent() { }

    /**
     * Returns title.
     */
    public CharSequence getTitle() {
        return mTitle;
    }

    /**
     * Returns start time.
     */
    public long getStartTimeUtcMillis() {
        return mStartTimeUtcMillis;
    }

    /**
     * Returns end time.
     */
    public long getEndTimeUtcMillis() {
        return mEndTimeUtcMillis;
    }

    /**
     * Returns description.
     */
    public String getDescription() {
        return mDescription;
    }

    /**
     * Returns Logo image URI as a String.
     */
    public String getLogoImageUri() {
        return mLogoImageUri;
    }

    /**
     * Returns background image URI as a String.
     */
    public String getBackgroundImageUri() {
        return mBackgroundImageUri;
    }

    /**
     * Copies other details content.
     */
    public void copyFrom(DetailsContent other) {
        if (this == other) {
            return;
        }
        mTitle = other.mTitle;
        mStartTimeUtcMillis = other.mStartTimeUtcMillis;
        mEndTimeUtcMillis = other.mEndTimeUtcMillis;
        mDescription = other.mDescription;
        mLogoImageUri = other.mLogoImageUri;
        mBackgroundImageUri = other.mBackgroundImageUri;
    }

    /**
     * A class for building details content.
     */
    public static final class Builder {
        private final DetailsContent mDetailsContent;

        public Builder() {
            mDetailsContent = new DetailsContent();
            mDetailsContent.mStartTimeUtcMillis = INVALID_TIME;
            mDetailsContent.mEndTimeUtcMillis = INVALID_TIME;
        }

        /**
         * Sets title.
         */
        public Builder setTitle(CharSequence title) {
            mDetailsContent.mTitle = title;
            return this;
        }

        /**
         * Sets start time.
         */
        public Builder setStartTimeUtcMillis(long startTimeUtcMillis) {
            mDetailsContent.mStartTimeUtcMillis = startTimeUtcMillis;
            return this;
        }

        /**
         * Sets end time.
         */
        public Builder setEndTimeUtcMillis(long endTimeUtcMillis) {
            mDetailsContent.mEndTimeUtcMillis = endTimeUtcMillis;
            return this;
        }

        /**
         * Sets description.
         */
        public Builder setDescription(String description) {
            mDetailsContent.mDescription = description;
            return this;
        }

        /**
         * Sets logo image URI as a String.
         */
        public Builder setLogoImageUri(String logoImageUri) {
            mDetailsContent.mLogoImageUri = logoImageUri;
            return this;
        }

        /**
         * Sets background image URI as a String.
         */
        public Builder setBackgroundImageUri(String backgroundImageUri) {
            mDetailsContent.mBackgroundImageUri = backgroundImageUri;
            return this;
        }

        /**
         * Sets background image and logo image URI from program and channel.
         */
        public Builder setImageUris(@Nullable BaseProgram program, @Nullable Channel channel) {
            if (program != null) {
                return setImageUris(program.getPosterArtUri(), program.getThumbnailUri(), channel);
            } else {
                return setImageUris(null, null, channel);
            }
        }

        /**
         * Sets background image and logo image URI and channel is used for fallback images.
         */
        public Builder setImageUris(@Nullable String posterArtUri,
                @Nullable String thumbnailUri, @Nullable Channel channel) {
            mDetailsContent.mLogoImageUri = null;
            mDetailsContent.mBackgroundImageUri = null;
            if (!TextUtils.isEmpty(posterArtUri) && !TextUtils.isEmpty(thumbnailUri)) {
                mDetailsContent.mLogoImageUri = posterArtUri;
                mDetailsContent.mBackgroundImageUri = thumbnailUri;
            } else if (!TextUtils.isEmpty(posterArtUri)) {
                // thumbnailUri is empty
                mDetailsContent.mLogoImageUri = posterArtUri;
                mDetailsContent.mBackgroundImageUri = posterArtUri;
            } else if (!TextUtils.isEmpty(thumbnailUri)) {
                // posterArtUri is empty
                mDetailsContent.mLogoImageUri = thumbnailUri;
                mDetailsContent.mBackgroundImageUri = thumbnailUri;
            }
            if (TextUtils.isEmpty(mDetailsContent.mLogoImageUri) && channel != null) {
                String channelLogoUri = TvContract.buildChannelLogoUri(channel.getId())
                        .toString();
                mDetailsContent.mLogoImageUri = channelLogoUri;
                mDetailsContent.mBackgroundImageUri = channelLogoUri;
            }
            return this;
        }

        /**
         * Builds details content.
         */
        public DetailsContent build() {
            DetailsContent detailsContent = new DetailsContent();
            detailsContent.copyFrom(mDetailsContent);
            return detailsContent;
        }
    }
}