/*
 * Copyright (C) 2021 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.chassis.car.ui.plugin.toolbar;

import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Switch;
import android.widget.TextView;

import androidx.annotation.NonNull;

import com.android.car.ui.plugin.oemapis.toolbar.MenuItemOEMV1;

import com.chassis.car.ui.plugin.R;
import com.chassis.car.ui.plugin.uxr.DrawableStateView;

class MenuItemView extends FrameLayout {
    private static final int[] RESTRICTED_STATE = new int[] {R.attr.state_ux_restricted};
    private static final int[] ENABLED_STATE = new int[] {android.R.attr.state_enabled};

    private final MenuItemOEMV1 mMenuItem;

    private final View mIconContainer;
    private final ImageView mIconView;
    private final Switch mSwitch;
    private final TextView mTextView;
    private final TextView mTextWithIconView;

    private final int mMenuItemIconSize;

    MenuItemView(
            @NonNull Context context,
            MenuItemOEMV1 menuItem) {
        super(context);
        mMenuItemIconSize = getResources().getDimensionPixelSize(R.dimen.primary_icon_size);

        setVisibility(View.GONE);

        LayoutInflater.from(getContext()).inflate(menuItem.isPrimary()
                ? R.layout.toolbar_menu_item_primary
                : R.layout.toolbar_menu_item, this, true);

        mIconContainer = requireViewById(R.id.car_ui_toolbar_menu_item_icon_container);
        mIconView = requireViewById(R.id.car_ui_toolbar_menu_item_icon);
        mSwitch = requireViewById(R.id.car_ui_toolbar_menu_item_switch);
        mTextView = requireViewById(R.id.car_ui_toolbar_menu_item_text);
        mTextWithIconView = requireViewById(R.id.car_ui_toolbar_menu_item_text_with_icon);

        mMenuItem = menuItem;
        onMenuItemUpdated(mMenuItem);
    }

    public void onMenuItemUpdated(MenuItemOEMV1 menuItem) {
        boolean hasIcon = mMenuItem.getIcon() != null;
        boolean hasText = !TextUtils.isEmpty(mMenuItem.getTitle());
        boolean textAndIcon = mMenuItem.isShowingIconAndTitle();
        boolean checkable = mMenuItem.isCheckable();

        if (!mMenuItem.isVisible() || (!checkable && !hasIcon && !hasText)) {
            setVisibility(View.GONE);
            return;
        }
        setVisibility(View.VISIBLE);
        setContentDescription(mMenuItem.getTitle());

        View clickTarget;
        if (checkable) {
            mSwitch.setChecked(mMenuItem.isChecked());
            clickTarget = mSwitch;
        } else if (hasText && hasIcon && textAndIcon) {
            mMenuItem.getIcon().setBounds(0, 0, mMenuItemIconSize, mMenuItemIconSize);
            mTextWithIconView.setCompoundDrawables(mMenuItem.getIcon(), null, null, null);
            mTextWithIconView.setText(mMenuItem.getTitle());
            clickTarget = mTextWithIconView;
        } else if (hasIcon) {
            mIconView.setImageDrawable(mMenuItem.getIcon());
            clickTarget = mIconContainer;
        } else { // hasText will be true
            mTextView.setText(mMenuItem.getTitle());
            clickTarget = mTextView;
        }

        mIconContainer.setVisibility(clickTarget == mIconContainer ? View.VISIBLE : View.GONE);
        mTextView.setVisibility(clickTarget == mTextView ? View.VISIBLE : View.GONE);
        mTextWithIconView.setVisibility(clickTarget == mTextWithIconView
                ? View.VISIBLE : View.GONE);
        mSwitch.setVisibility(clickTarget == mSwitch ? View.VISIBLE : View.GONE);

        if (!mMenuItem.isTinted() && hasIcon) {
            mMenuItem.getIcon().setTintList(null);
        }

        recursiveSetEnabledAndDrawableState(this);
        setActivated(mMenuItem.isActivated());

        Runnable onClickListener = mMenuItem.getOnClickListener();
        if (onClickListener != null) {
            clickTarget.setOnClickListener(v -> {
                if (mMenuItem.isEnabled()) {
                    onClickListener.run();
                }
            });
        } else {
            clickTarget.setOnClickListener(null);
            clickTarget.setClickable(false);
        }
    }

    private void recursiveSetEnabledAndDrawableState(View view) {
        int[] drawableState = mMenuItem.isRestricted() ? RESTRICTED_STATE : null;
        int[] drawableStateToRemove = mMenuItem.isEnabled() ? null : ENABLED_STATE;

        if (view instanceof DrawableStateView) {
            ((DrawableStateView) view).setExtraDrawableState(drawableState, drawableStateToRemove);
        }

        if (view instanceof ViewGroup) {
            ViewGroup viewGroup = ((ViewGroup) view);
            for (int i = 0; i < viewGroup.getChildCount(); i++) {
                recursiveSetEnabledAndDrawableState(viewGroup.getChildAt(i));
            }
        }
    }
}
