package com.moxun.s2v;

import com.intellij.notification.NotificationType;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.xml.XmlFile;
import com.intellij.ui.JBColor;
import com.moxun.s2v.message.ErrorMessage;
import com.moxun.s2v.utils.*;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

/**
 * Created by moxun on 15/12/14.
 */
public class GUI {
    private JPanel rootPanel;
    private JComboBox dpiChooser;
    private JTextField svgPath;
    private JButton svgSelectBtn;
    private JComboBox moduleChooser;
    private JButton generateButton;
    private JTextField xmlName;
    private JCheckBox batch;
    private JFrame frame;

    private Project project;
    private Set<String> distDirList = new HashSet<String>();
    private ModulesUtil modulesUtil;
    private XmlFile svg;
    private PsiDirectory svgDir;

    public GUI(Project project) {
        this.project = project;
        frame = new JFrame("SVG to VectorDrawable (" + CommonUtil.loadMetaInf("version", "") + ")");
        modulesUtil = new ModulesUtil(project);
        distDirList.clear();
        svgPath.setFocusable(false);
        setListener();
        initModules();
    }

    private void initModules() {
        for (String item : modulesUtil.getModules()) {
            moduleChooser.addItem(item);
        }
    }

    private void setListener() {
        batch.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                svgPath.setText("");
                xmlName.setText("");
            }
        });

        svgPath.addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {
                svgPath.setBackground(JBColor.YELLOW);
            }

            @Override
            public void focusLost(FocusEvent e) {
                svgPath.setBackground(JBColor.WHITE);
            }
        });

        xmlName.addFocusListener(new FocusListener() {
            @Override
            public void focusGained(FocusEvent e) {
                xmlName.setBackground(JBColor.YELLOW);
            }

            @Override
            public void focusLost(FocusEvent e) {
                xmlName.setBackground(JBColor.WHITE);
            }
        });

        svgSelectBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showSVGChooser();
                check();
            }
        });

        moduleChooser.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dpiChooser.setRenderer(new MyCellRender(modulesUtil.getExistDpiDirs(moduleChooser.getSelectedItem().toString())));
            }
        });

        generateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String moduleName = (String) moduleChooser.getSelectedItem();
                if (moduleName != null) {
                    PsiDirectory resDir = modulesUtil.getResDir(moduleName);
                    if (resDir != null) {
                        Logger.debug("Got res dir " + resDir.getVirtualFile().getPath());
                        Logger.debug("Existing drawable dirs " + modulesUtil.getDrawableDirs(resDir));
                    }
                }
                if (modulesUtil.isAndroidProject()) {
                    if (check() && !batch.isSelected()) {
                        final Transformer transformer = new Transformer.Builder()
                                .setProject(project)
                                .setSVG(svg)
                                .setDpi((String) dpiChooser.getSelectedItem())
                                .setModule(moduleName)
                                .setXmlName(xmlName.getText())
                                .create();

                        transformer.transforming(new Transformer.CallBack() {
                            @Override
                            public void onComplete(XmlFile dist) {
                                transformer.writeXmlToDir(dist, true);
                                CommonUtil.showTopic(project,
                                        "SVG to VectorDrawable",
                                        "Generating completed.<br>" + dist.getName(),
                                        NotificationType.INFORMATION);
                            }
                        });
                    } else if (check() && batch.isSelected()) {
                        final java.util.List<String> files = new ArrayList<String>();
                        for (PsiFile svg : svgDir.getFiles()) {
                            if (svg != null && !svg.isDirectory() && svg.getName().toLowerCase().endsWith(".svg")) {
                                final Transformer transformer = new Transformer.Builder()
                                        .setProject(project)
                                        .setSVG((XmlFile) svg)
                                        .setDpi((String) dpiChooser.getSelectedItem())
                                        .setModule(moduleName)
                                        .setXmlName(CommonUtil.getValidName(svg.getName().split("\\.")[0]) + ".xml")
                                        .create();

                                Transformer.CallBack callBack = new Transformer.CallBack() {
                                    @Override
                                    public void onComplete(XmlFile dist) {
                                        transformer.writeXmlToDir(dist, false);
                                        files.add(dist.getName());
                                    }
                                };
                                transformer.transforming(callBack);
                            }
                        }

                        String msg = "";
                        for (String s : files) {
                            msg = msg + s + "<br>";
                        }

                        CommonUtil.showTopic(project,
                                "SVG to VectorDrawable",
                                "Generating completed." + msg,
                                NotificationType.INFORMATION);
                    }
                    frame.dispose();
                } else {
                    ErrorMessage.show(project, "Current project is not an Android project!");
                    frame.dispose();
                }
            }
        });
    }

    private void showSVGChooser() {
        FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor();
        if (!batch.isSelected()) {
            descriptor = FileChooserDescriptorFactory.createSingleFileDescriptor("svg");
        }
        VirtualFile virtualFile = FileChooser.chooseFile(descriptor, project, null);
        if (virtualFile != null) {
            if (!virtualFile.isDirectory() && virtualFile.getName().toLowerCase().endsWith("svg")) {
                svg = (XmlFile) PsiManager.getInstance(project).findFile(virtualFile);
                //got *.svg file as xml
                svgPath.setText(virtualFile.getPath());
                xmlName.setEditable(true);
                xmlName.setEnabled(true);
                xmlName.setText(CommonUtil.getValidName(svg.getName().split("\\.")[0]) + ".xml");
            } else if (virtualFile.isDirectory()) {
                svgDir = PsiManager.getInstance(project).findDirectory(virtualFile);
                svgPath.setText(virtualFile.getPath());
                xmlName.setEditable(false);
                xmlName.setEnabled(false);
                xmlName.setText("keep origin name");
            }
        }
        frame.setAlwaysOnTop(true);
    }

    public void show() {
        frame.setContentPane(rootPanel);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(frame.getParent());
        frame.setVisible(true);

        UpdateUtil.checkUpdate(project);
    }

    private boolean check() {
        boolean pass = false;
        if (svgPath.getText().isEmpty()) {
            svgPath.setBackground(new Color(0xff, 0xae, 0xb9));
            pass = false;
        } else {
            svgPath.setBackground(Color.WHITE);
            pass = true;
        }

        if (xmlName.getText().isEmpty()) {
            xmlName.setBackground(new Color(0xff, 0xae, 0xb9));
            pass = false;
        } else {
            xmlName.setBackground(Color.WHITE);
            pass = true;
        }
        return pass;
    }
}