package com.dim.ui;

import com.android.ddmlib.*;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.playback.commands.ActionCommand;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowFactory;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentFactory;
import org.jetbrains.android.sdk.AndroidSdkUtils;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import static com.dim.utils.DeviceHelper.checkDuangAppInstalled;
import static com.dim.utils.PropertyHelper.*;
import static com.dim.utils.ThirdAnaction.*;

/**
 * Created by dim on 17/4/29.
 */
public class WindowTool implements ToolWindowFactory {
    private JPanel panel1;
    private JButton pullDatabaseFromDeviceButton;
    private JButton pullPreferenceFromDeviceButton;
    private JButton pullANRInfoFromButton;
    private JButton pullMethodTracingInfoButton1;
    private JCheckBox layoutBoundaries;
    private JCheckBox GPUUpdates;
    private JComboBox devices;
    private JCheckBox overdraw;
    private JCheckBox rendering;
    private JButton ADBUninstallAppButton;
    private JButton ADBClearAppDataButton;
    private JButton ADBKillApp;
    private JButton ADBStartApp;
    private JButton ADBRestartApp;
    private JButton ADBClearRestartAppData;
    private List<IDevice> deviceList = new ArrayList<IDevice>();
    private IDevice selectDevice;
    private AndroidDebugBridge bridge;

    @Override
    public void createToolWindowContent(@NotNull final Project project, @NotNull ToolWindow toolWindow) {
        ContentFactory contentFactory = ContentFactory.SERVICE.getInstance();
        Content content = contentFactory.createContent(panel1, "", false);
        toolWindow.getContentManager().addContent(content);
        pullDatabaseFromDeviceButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionPerform("com.dim.action.PullDatabaseAction");
            }
        });
        pullPreferenceFromDeviceButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionPerform("com.dim.action.PullPreferenceAction");
            }
        });
        pullANRInfoFromButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionPerform("com.dim.action.PullAnrAction");
            }
        });
        pullMethodTracingInfoButton1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionPerform("com.dim.action.PullTraceMethodAction");
            }
        });

        initThirdAnAction();
        initClickListener();
        update(project);
        AndroidDebugBridge.addDeviceChangeListener(new AndroidDebugBridge.IDeviceChangeListener() {

            @Override
            public void deviceConnected(IDevice iDevice) {
                if (selectDevice == null || !selectDevice.isOnline()) {
                    update(project);
                }
            }

            @Override
            public void deviceDisconnected(IDevice iDevice) {
            }

            @Override
            public void deviceChanged(IDevice iDevice, int i) {
            }
        });

    }

    private void initThirdAnAction() {
        ADBUninstallAppButton.setVisible(isEnable(UninstallAction));
        ADBClearAppDataButton.setVisible(isEnable(ClearDataAction));
        ADBKillApp.setVisible(isEnable(KillAction));
        ADBStartApp.setVisible(isEnable(StartAction));
        ADBRestartApp.setVisible(isEnable(RestartAction));
        ADBClearRestartAppData.setVisible(isEnable(ClearDataAndRestartAction));
        ADBUninstallAppButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionPerform(UninstallAction);
            }
        });
        ADBClearAppDataButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionPerform(ClearDataAction);
            }
        });
        ADBKillApp.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionPerform(KillAction);
            }
        });
        ADBStartApp.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionPerform(StartAction);
            }
        });
        ADBRestartApp.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionPerform(RestartAction);
            }
        });
        ADBClearRestartAppData.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                actionPerform(ClearDataAndRestartAction);
            }
        });
    }

    private boolean isEnable(String action) {
        ActionManager am = ActionManager.getInstance();
        return am.getAction(action) != null;
    }

    private void initClickListener() {
        overdraw.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (selectDevice != null) {
                    setShowOverdrawEnabled(selectDevice, overdraw.isSelected(), new MultiLineReceiver() {
                        @Override
                        public boolean isCancelled() {
                            return false;
                        }

                        @Override
                        public void processNewLines(String[] strings) {
                            overdraw.setSelected(isShowOverdrawEnabled(selectDevice));
                        }
                    });
                }
            }
        });
        rendering.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                if (selectDevice != null) {
                    setProfileGPURenderingEnabled(selectDevice, rendering.isSelected(), new MultiLineReceiver() {

                        @Override
                        public boolean isCancelled() {
                            return false;
                        }

                        @Override
                        public void processNewLines(String[] strings) {
                            rendering.setSelected(isShowProfileGPURendering(selectDevice));
                        }
                    });
                }
            }
        });
        layoutBoundaries.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                if (selectDevice != null) {
                    setDebugLayoutEnabled(selectDevice, layoutBoundaries.isSelected(), new MultiLineReceiver() {

                        @Override
                        public boolean isCancelled() {
                            return false;
                        }

                        @Override
                        public void processNewLines(String[] strings) {
                            layoutBoundaries.setSelected(isDebugLayoutEnabled(selectDevice));
                        }
                    });
                }
            }
        });
        GPUUpdates.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                if (selectDevice != null) {
                    setLayoutUpdateEnable(selectDevice, GPUUpdates.isSelected(), new MultiLineReceiver() {

                        @Override
                        public boolean isCancelled() {
                            return false;
                        }

                        @Override
                        public void processNewLines(String[] strings) {
                            GPUUpdates.setSelected(isLayoutUpdateEnabled(selectDevice));
                        }
                    });
                }
            }
        });
    }

    private void update(@NotNull Project project) {
        boolean update = initDevices(project);
        if (selectDevice != null) {
            checkDuangAppInstalled(selectDevice);
            if (update) {
                devices.removeAllItems();
                int index = 0;
                for (int i = 0; i < deviceList.size(); i++) {
                    IDevice device = deviceList.get(i);
                    devices.addItem(device.getName());
                    if (device.getName().equals(selectDevice.getName()) && device.getSerialNumber().equals(selectDevice.getSerialNumber())) {
                        index = i;
                    }

                }
                devices.setSelectedIndex(index);
            }
            overdraw.setSelected(isShowOverdrawEnabled(selectDevice));
            rendering.setSelected(isShowProfileGPURendering(selectDevice));
            layoutBoundaries.setSelected(isDebugLayoutEnabled(selectDevice));
            GPUUpdates.setSelected(isLayoutUpdateEnabled(selectDevice));
        }
    }


    private boolean initDevices(Project project) {
        boolean update = true;
        if (bridge == null) {
            bridge = AndroidSdkUtils.getDebugBridge(project);
        }
        deviceList.clear();
        if (bridge != null) {
            IDevice[] devices = bridge.getDevices();
            if (devices != null) {
                for (IDevice device : devices) {
                    if (selectDevice != null) {
                        if (device.getName().equals(selectDevice.getName()) && device.getSerialNumber().equals(selectDevice.getSerialNumber())) {
                            selectDevice = device;
                            update = false;
                        }
                    }
                    deviceList.add(device);
                }
            }
            if (deviceList.size() > 0 && selectDevice == null) {
                selectDevice = deviceList.get(0);
                update = true;
            }
        } else {
            update = false;
        }
        return update;
    }

    private void actionPerform(String action) {
        ActionManager am = ActionManager.getInstance();
        am.tryToExecute(am.getAction(action),
                ActionCommand.getInputEvent(action), panel1, "", true);

    }
}