package com.reactnativenavigation.views;

import android.content.Context;
import android.view.Menu;
import android.view.ViewManager;

import com.facebook.react.bridge.Callback;
import com.reactnativenavigation.NavigationApplication;
import com.reactnativenavigation.events.ContextualMenuHiddenEvent;
import com.reactnativenavigation.events.EventBus;
import com.reactnativenavigation.params.ContextualMenuButtonParams;
import com.reactnativenavigation.params.ContextualMenuParams;
import com.reactnativenavigation.params.StyleParams;
import com.reactnativenavigation.params.TitleBarLeftButtonParams;

import java.util.List;

public class ContextualMenu extends TitleBar implements LeftButtonOnClickListener, ContextualMenuButton.ContextualButtonClickListener {
    private ContextualMenuParams params;
    private Callback onButtonClicked;
    private final String navigatorEventId;

    public ContextualMenu(Context context, ContextualMenuParams params, StyleParams styleParams, Callback onButtonClicked) {
        super(context);
        this.params = params;
        this.onButtonClicked = onButtonClicked;
        navigatorEventId = params.navigationParams.navigatorEventId;
        setStyle(styleParams);
        setButtons();
    }

    public void setStyle(StyleParams styleParams) {
        params.setButtonsColor(styleParams.contextualMenuButtonsColor);
        if (styleParams.contextualMenuBackgroundColor.hasColor()) {
            setBackgroundColor(styleParams.contextualMenuBackgroundColor.getColor());
        }
    }

    public void setButtons() {
        addButtonsToContextualMenu(params.buttons, getMenu());
        setBackButton(params.leftButton);
    }

    private void setBackButton(TitleBarLeftButtonParams leftButton) {
        setLeftButton(leftButton, this, null, false);
    }

    private void addButtonsToContextualMenu(List<ContextualMenuButtonParams> buttons, Menu menu) {
        for (int i = 0; i < buttons.size(); i++) {
            final TitleBarButton button = new ContextualMenuButton(menu, this, buttons.get(i), this);
            addButtonInReverseOrder(buttons, i, button);
        }
    }

    @Override
    public boolean onTitleBarBackButtonClick() {
        dismiss();
        EventBus.instance.post(new ContextualMenuHiddenEvent());
        return true;
    }

    @Override
    public void onSideMenuButtonClick() {
        // nothing
    }

    @Override
    public void onClick(int index) {
        dismiss();
        EventBus.instance.post(new ContextualMenuHiddenEvent());
        onButtonClicked.invoke(index);
    }

    public void dismiss() {
        hide(new Runnable() {
            @Override
            public void run() {
                ((ViewManager) getParent()).removeView(ContextualMenu.this);
            }
        });
        NavigationApplication.instance.getEventEmitter().sendNavigatorEvent("contextualMenuDismissed", navigatorEventId);
    }
}