/*
 * 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.menu;

import android.content.Context;
import android.view.View;
import com.android.tv.R;
import com.android.tv.TvSingletons;
import com.android.tv.analytics.Tracker;
import java.util.List;

/*
 * An adapter of options.
 */
public abstract class OptionsRowAdapter extends ItemListRowView.ItemListAdapter<MenuAction> {
    private static final String CUSTOM_ACTION_LABEL = "custom action";
    protected final Tracker mTracker;
    private List<MenuAction> mActionList;

    private final View.OnClickListener mMenuActionOnClickListener =
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    final MenuAction action = (MenuAction) view.getTag();
                    view.post(
                            new Runnable() {
                                @Override
                                public void run() {
                                    int resId = action.getActionNameResId();
                                    if (resId == 0) {
                                        mTracker.sendMenuClicked(CUSTOM_ACTION_LABEL);
                                    } else {
                                        mTracker.sendMenuClicked(resId);
                                    }
                                    executeAction(action.getType());
                                }
                            });
                }
            };

    public OptionsRowAdapter(Context context) {
        super(context);
        mTracker = TvSingletons.getSingletons(context).getTracker();
    }

    /** Update action list and its content. */
    @Override
    public void update() {
        if (mActionList == null) {
            mActionList = createActions();
            setItemList(mActionList);
        } else {
            updateActions();
        }
    }

    @Override
    protected int getLayoutResId(int viewType) {
        return R.layout.menu_card_action;
    }

    protected abstract List<MenuAction> createActions();

    protected abstract void updateActions();

    protected abstract void executeAction(int type);

    /**
     * Gets the action at the given position. Note that action at the position may differ from
     * returned by {@link #createActions}. See {@link CustomizableOptionsRowAdapter}
     */
    protected MenuAction getAction(int position) {
        return mActionList.get(position);
    }

    @Override
    public void onBindViewHolder(MyViewHolder viewHolder, int position) {
        super.onBindViewHolder(viewHolder, position);

        viewHolder.itemView.setTag(getItemList().get(position));
        viewHolder.itemView.setOnClickListener(mMenuActionOnClickListener);
    }

    @Override
    public int getItemViewType(int position) {
        // This makes 1:1 mapping from MenuAction to ActionCardView. That is, an ActionCardView will
        // not be used(recycled) by other type of MenuAction. So the selection state of the view can
        // be preserved.
        return mActionList.get(position).getType();
    }
}
