/*
 * 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.app.Activity;
import android.support.annotation.CallSuper;
import android.support.v17.leanback.widget.Presenter;
import android.view.View;
import android.view.View.OnClickListener;

import com.android.tv.dvr.ui.DvrUiHelper;

import java.util.HashSet;
import java.util.Set;

/**
 * An abstract class to present DVR items in {@link RecordingCardView}, which is mainly used in
 * {@link DvrBrowseFragment}. DVR items might include:
 * {@link com.android.tv.dvr.data.ScheduledRecording},
 * {@link com.android.tv.dvr.data.RecordedProgram}, and
 * {@link com.android.tv.dvr.data.SeriesRecording}.
 */
public abstract class DvrItemPresenter extends Presenter {
    private final Set<ViewHolder> mBoundViewHolders = new HashSet<>();
    private final OnClickListener mOnClickListener = onCreateOnClickListener();

    @Override
    @CallSuper
    public void onBindViewHolder(ViewHolder viewHolder, Object o) {
        viewHolder.view.setTag(o);
        viewHolder.view.setOnClickListener(mOnClickListener);
        mBoundViewHolders.add(viewHolder);
    }

    @Override
    @CallSuper
    public void onUnbindViewHolder(ViewHolder viewHolder) {
        mBoundViewHolders.remove(viewHolder);
        viewHolder.view.setTag(null);
        viewHolder.view.setOnClickListener(null);
    }

    /**
     * Unbinds all bound view holders.
     */
    public void unbindAllViewHolders() {
        // When browse fragments are destroyed, RecyclerView would not call presenters'
        // onUnbindViewHolder(). We should handle it by ourselves to prevent resources leaks.
        for (ViewHolder viewHolder : new HashSet<>(mBoundViewHolders)) {
            onUnbindViewHolder(viewHolder);
        }
    }

    /**
     * Creates {@link OnClickListener} for DVR library's card views.
     */
    protected OnClickListener onCreateOnClickListener() {
        return new OnClickListener() {
            @Override
            public void onClick(View view) {
                if (view instanceof RecordingCardView) {
                    RecordingCardView v = (RecordingCardView) view;
                    DvrUiHelper.startDetailsActivity((Activity) v.getContext(),
                            v.getTag(), v.getImageView(), false);
                }
            }
        };
    }
}