/*
 * 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.util.AttributeSet;
import android.util.Log;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.android.tv.R;

/** A view to render an item of TV options. */
public class ActionCardView extends RelativeLayout implements ItemListRowView.CardView<MenuAction> {
    private static final String TAG = MenuView.TAG;
    private static final boolean DEBUG = MenuView.DEBUG;

    private static final float OPACITY_DISABLED = 0.3f;
    private static final float OPACITY_ENABLED = 1.0f;

    private ImageView mIconView;
    private TextView mLabelView;
    private TextView mStateView;

    public ActionCardView(Context context) {
        this(context, null);
    }

    public ActionCardView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ActionCardView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mIconView = (ImageView) findViewById(R.id.action_card_icon);
        mLabelView = (TextView) findViewById(R.id.action_card_label);
        mStateView = (TextView) findViewById(R.id.action_card_state);
    }

    @Override
    public void onBind(MenuAction action, boolean selected) {
        if (DEBUG) {
            Log.d(TAG, "onBind: action=" + action.getActionName(getContext()));
        }
        mIconView.setImageDrawable(action.getDrawable(getContext()));
        mLabelView.setText(action.getActionName(getContext()));
        mStateView.setText(action.getActionDescription());
        if (action.isEnabled()) {
            setEnabled(true);
            setFocusable(true);
            mIconView.setAlpha(OPACITY_ENABLED);
            mLabelView.setAlpha(OPACITY_ENABLED);
            mStateView.setAlpha(OPACITY_ENABLED);
        } else {
            setEnabled(false);
            setFocusable(false);
            mIconView.setAlpha(OPACITY_DISABLED);
            mLabelView.setAlpha(OPACITY_DISABLED);
            mStateView.setAlpha(OPACITY_DISABLED);
        }
    }

    @Override
    public void onSelected() {
        if (DEBUG) {
            Log.d(TAG, "onSelected: action=" + mLabelView.getText());
        }
    }

    @Override
    public void onDeselected() {
        if (DEBUG) {
            Log.d(TAG, "onDeselected: action=" + mLabelView.getText());
        }
    }

    /** Request focus and accessibility focus on card view. */
    @Override
    public boolean requestFocusWithAccessibility() {
        return requestFocus() &&
                performAccessibilityAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null);
    }

    @Override
    public void onRecycled() {}
}
