package com.github.xburning.dubboswitch.view.app;

import com.github.xburning.dubboswitch.entity.ZookeeperApp;
import com.github.xburning.dubboswitch.entity.ZookeeperConsumer;
import com.github.xburning.dubboswitch.entity.ZookeeperProvider;
import com.github.xburning.dubboswitch.repository.ZookeeperAppRepository;
import com.github.xburning.dubboswitch.repository.ZookeeperConsumerRepository;
import com.github.xburning.dubboswitch.repository.ZookeeperProviderRepository;
import com.github.xburning.dubboswitch.util.DubboServiceBean;
import com.github.xburning.dubboswitch.util.DubboSwitchTool;
import com.github.xburning.dubboswitch.util.Response;
import com.vaadin.event.FieldEvents;
import com.vaadin.server.FontAwesome;
import com.vaadin.shared.ui.combobox.FilteringMode;
import com.vaadin.spring.annotation.SpringUI;
import com.vaadin.ui.*;
import com.vaadin.ui.themes.ValoTheme;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;

import java.util.List;

import static java.awt.SystemColor.menu;

/**
 * Zookeeper 查看应用服务
 */
@SpringUI
public class ZookeeperAppViewUI extends Window{

    private final ZookeeperConsumerRepository zookeeperConsumerRepository;

    private final ZookeeperProviderRepository zookeeperProviderRepository;

    private TextField appNameField;

    private ComboBox viewBox;

    private boolean isSelectedConsumer = true;

    private Tree viewTree;

    private OptionGroup zkOption;

    @Autowired
    public ZookeeperAppViewUI(ZookeeperConsumerRepository zookeeperConsumerRepository,ZookeeperProviderRepository zookeeperProviderRepository) {
        super("查看应用服务");
        this.zookeeperConsumerRepository = zookeeperConsumerRepository;
        this.zookeeperProviderRepository = zookeeperProviderRepository;
        center();
        setModal(true);
        setClosable(true);
        setDraggable(false);
        setResizable(false);
        setWidth(1000,Unit.PIXELS);
        setHeight(600,Unit.PIXELS);
        setContent();
    }

    /**
     * 设置内容
     */
    private void setContent() {
        VerticalLayout verticalLayout = new VerticalLayout();
        addOperateLayout(verticalLayout);
        addViewTree(verticalLayout);
        setContent(verticalLayout);
    }

    /**
     * 添加操作布局
     * @param verticalLayout
     */
    private void addOperateLayout(VerticalLayout verticalLayout) {
        Panel operatePanel = new Panel();
        operatePanel.setHeight(70,Unit.PIXELS);
        HorizontalLayout operateLayout = new HorizontalLayout();
        operateLayout.addComponent(createAppNameField());
        operateLayout.addComponent(createZkOptionGroup());
        operateLayout.addComponent(createViewBox());
        operateLayout.addComponent(createViewButton());
        operateLayout.setSpacing(true);
        operateLayout.setMargin(true);
        operatePanel.setContent(operateLayout);
        verticalLayout.addComponent(operatePanel);
    }

    /**
     * 添加查看树
     * @param verticalLayout
     */
    private void addViewTree(VerticalLayout verticalLayout) {
        viewTree = new Tree();
        Panel treePanel = new Panel();
        treePanel.setHeight(490,Unit.PIXELS);
        treePanel.setWidth(1000,Unit.PIXELS);
        treePanel.setContent(viewTree);
        verticalLayout.addComponent(treePanel);
    }


    /**
     * 应用名称
     * @return
     */
    private TextField createAppNameField() {
        appNameField = new TextField();
        return appNameField;
    }

    /**
     * zk
     * @return
     */
    private OptionGroup createZkOptionGroup(){
        zkOption = new OptionGroup();
        zkOption.addItem(0);
        zkOption.setItemCaption(0, "消费者");
        zkOption.addItem(1);
        zkOption.setItemCaption(1, "提供者");
        zkOption.setStyleName(ValoTheme.OPTIONGROUP_HORIZONTAL);
        zkOption.select(0);
        zkOption.setNullSelectionAllowed(false);
        zkOption.addBlurListener((FieldEvents.BlurListener) blurEvent -> {
            String selected = blurEvent.getSource().toString();
            if ("0".equals(selected)) {
                isSelectedConsumer = true;
                reloadConsumerViewBox();
            } else if ("1".equals(selected)) {
                isSelectedConsumer = false;
                reloadProviderViewBox();
            }
        });
        return zkOption;
    }

    /**
     * 创建查看列表
     * @return
     */
    private ComboBox createViewBox() {
        viewBox = new ComboBox();
        viewBox.setWidth("100%");
        viewBox.setFilteringMode(FilteringMode.OFF);
        viewBox.setTextInputAllowed(false);
        reloadConsumerViewBox();
        return viewBox;
    }

    /**
     * 重新装载消费者
     */
    private void reloadConsumerViewBox() {
        viewBox.removeAllItems();
        List<ZookeeperConsumer> consumers = zookeeperConsumerRepository.findAll();
        for (ZookeeperConsumer consumer : consumers) {
            viewBox.addItem(consumer.getId());
            viewBox.setItemCaption(consumer.getId(),consumer.getName());
        }
    }

    /**
     * 重新装载提供者
     */
    private void reloadProviderViewBox() {
        viewBox.removeAllItems();
        List<ZookeeperProvider> providers = zookeeperProviderRepository.findAll();
        for (ZookeeperProvider provider : providers) {
            viewBox.addItem(provider.getId());
            viewBox.setItemCaption(provider.getId(),provider.getName());
        }
    }

    /**
     * 查看按钮
     * @return
     */
    private Button createViewButton(){
        Button viewButton = new Button("查看",FontAwesome.EYE);
        viewButton.setStyleName(ValoTheme.BUTTON_FRIENDLY);
        viewButton.setDisableOnClick(true);
        viewButton.addClickListener((Button.ClickListener) clickEvent -> {
            Long id = (Long) viewBox.getValue();
            if (id == null) {
                Notification.show("请选择要查看的" + (isSelectedConsumer ? "消费者" : "提供者") + "!", Notification.Type.ERROR_MESSAGE);
                viewButton.setEnabled(true);
                return;
            }
            ZookeeperConsumer consumer = null;
            ZookeeperProvider provider = null;
            if (isSelectedConsumer) {
                consumer = zookeeperConsumerRepository.findOne(id);
                if (consumer == null) {
                    Notification.show("消费者获取失败!", Notification.Type.ERROR_MESSAGE);
                    viewButton.setEnabled(true);
                    return;
                }
            } else {
                provider = zookeeperProviderRepository.findOne(id);
                if (provider == null) {
                    Notification.show("提供者获取失败!", Notification.Type.ERROR_MESSAGE);
                    viewButton.setEnabled(true);
                    return;
                }
            }
            String hostPort = isSelectedConsumer ? (consumer.getIp() + ":" + consumer.getPort()) : (provider.getIp() + ":" + provider.getPort());
            Response response = DubboSwitchTool.viewAppServices(hostPort, appNameField.getValue());
            if (!response.isSuccess()) {
                Notification.show(response.getMessage(), Notification.Type.ERROR_MESSAGE);
                viewButton.setEnabled(true);
                return;
            }
            buildViewUI(response.getDubboServiceBeanList());
            viewButton.setEnabled(true);
        });
        return viewButton;
    }


    /**
     * 构建UI
     * @param dubboServiceBeanList
     */
    private void buildViewUI(List<DubboServiceBean> dubboServiceBeanList) {
        viewTree.removeAllItems();
        for (DubboServiceBean dubboServiceBean : dubboServiceBeanList) {
            String serviceName = dubboServiceBean.getServiceName();
            viewTree.addItem(serviceName);
            viewTree.expandItem(serviceName);
            viewTree.setItemIcon(serviceName,FontAwesome.CLOUD);
            addServiceNode(dubboServiceBean, serviceName,"consumers");
            addServiceNode(dubboServiceBean, serviceName,"providers");
        }
    }

    /**
     * 添加节点
     * @param dubboServiceBean
     * @param serviceName
     * @param node
     */
    private void addServiceNode(DubboServiceBean dubboServiceBean, String serviceName,String node) {
        String serviceNode = serviceName + "->" + node;
        viewTree.addItem(serviceNode);
        viewTree.setParent(serviceNode, serviceName);
        viewTree.expandItem(serviceNode);
        List<String> nodeList = null;
        if ("providers".equals(node)) {
            nodeList = dubboServiceBean.getProvidersList();
        } else if ("consumers".equals(node)) {
            nodeList = dubboServiceBean.getConsumersList();
        }
        if (nodeList != null) {
            for (String _node : nodeList) {
                String url = DubboSwitchTool.decode(_node);
                viewTree.addItem(url);
                viewTree.setParent(url, _node);
                viewTree.setItemIcon(url,FontAwesome.STAR_O);
                viewTree.setChildrenAllowed(url, false);
            }
        }
    }

    /**
     * 显示
     * @param appName
     */
    public void show(String appName) {
        appNameField.setReadOnly(false);
        appNameField.setValue(appName);
        appNameField.setReadOnly(true);
        zkOption.select(0);
        reloadConsumerViewBox();
        viewTree.removeAllItems();
    }
}