/*
 * Copyright (C) 2015 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.ui.sidepanel;

import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;

import com.android.tv.R;
import com.android.tv.data.ChannelDataManager;
import com.android.tv.data.ChannelDataManager.ChannelListener;
import com.android.tv.data.OnCurrentProgramUpdatedListener;
import com.android.tv.data.ProgramDataManager;
import com.android.tv.data.api.Channel;
import com.android.tv.data.api.Program;

public abstract class ChannelCheckItem extends CompoundButtonItem {
    private final ChannelDataManager mChannelDataManager;
    private final ProgramDataManager mProgramDataManager;
    private Channel mChannel;
    private TextView mProgramTitleView;
    private TextView mChannelNumberView;
    private final ChannelListener mChannelListener =
            new ChannelListener() {
                @Override
                public void onChannelRemoved(Channel channel) {}

                @Override
                public void onChannelUpdated(Channel channel) {
                    mChannel = channel;
                }
            };

    private final OnCurrentProgramUpdatedListener mOnCurrentProgramUpdatedListener =
            new OnCurrentProgramUpdatedListener() {
                @Override
                public void onCurrentProgramUpdated(long channelId, Program program) {
                    updateProgramTitle(program);
                }
            };

    public ChannelCheckItem(
            Channel channel,
            ChannelDataManager channelDataManager,
            ProgramDataManager programDataManager) {
        super(channel.getDisplayName(), "");
        mChannel = channel;
        mChannelDataManager = channelDataManager;
        mProgramDataManager = programDataManager;
    }

    protected Channel getChannel() {
        return mChannel;
    }

    @Override
    protected int getResourceId() {
        return R.layout.option_item_channel_check;
    }

    @Override
    protected int getCompoundButtonId() {
        return R.id.check_box;
    }

    @Override
    protected int getTitleViewId() {
        return R.id.channel_name;
    }

    @Override
    protected int getDescriptionViewId() {
        return R.id.program_title;
    }

    @Override
    protected void onBind(View view) {
        super.onBind(view);
        mChannelNumberView = (TextView) view.findViewById(R.id.channel_number);
        mProgramTitleView = (TextView) view.findViewById(R.id.program_title);
        mChannelDataManager.addChannelListener(mChannel.getId(), mChannelListener);
        mProgramDataManager.addOnCurrentProgramUpdatedListener(
                mChannel.getId(), mOnCurrentProgramUpdatedListener);
    }

    @Override
    protected void onUpdate() {
        super.onUpdate();
        mChannelNumberView.setText(getChannel().getDisplayNumber());
        updateProgramTitle(mProgramDataManager.getCurrentProgram(mChannel.getId()));
    }

    @Override
    protected void onUnbind() {
        mChannelDataManager.removeChannelListener(mChannel.getId(), mChannelListener);
        mProgramDataManager.removeOnCurrentProgramUpdatedListener(
                mChannel.getId(), mOnCurrentProgramUpdatedListener);
        mProgramTitleView = null;
        mChannelNumberView = null;
        super.onUnbind();
    }

    @Override
    protected void onSelected() {
        setChecked(!isChecked());
    }

    private void updateProgramTitle(Program program) {
        String title = null;
        if (program != null) {
            title = program.getTitle();
        }
        if (TextUtils.isEmpty(title)) {
            title = mProgramTitleView.getContext().getString(R.string.no_program_information);
        }
        mProgramTitleView.setText(title);
    }
}
