package rb;

import com.intellij.openapi.progress.PerformInBackgroundOption;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.ui.TextFieldWithStoredHistory;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Created by IntelliJ IDEA.
 * User: Gong Zeng
 * Date: 5/13/11
 * Time: 2:24 PM
 */
public class PrePostReviewForm extends DialogWrapper {
    private JPanel rootContainer;
    private JTextArea descTextArea;
    private JRadioButton newRequestRadioButton;
    private JRadioButton existingRequestRadioButton;
    private JTextField reviewIdTextField;
    private JTextField summaryTextField;
    private JTextField branchTextField;
    private JTextField bugTextField;
    private TextFieldWithStoredHistory groupTextField;
    private TextFieldWithStoredHistory peopleTextField;
    private JButton showDiffButton;
    private JButton loadReviewButton;
    private JComboBox<RepoComboItem> comboBoxRepository;
    private Project project;
    private JTextArea diffTextArea;

    static class RepoComboItem {
        private Repository repo;

        public RepoComboItem(Repository repo) {
            this.repo = repo;
        }

        @Override
        public String toString() {
            return String.format("%s(%s)", repo.name, repo.id);
        }
    }

    public PrePostReviewForm(final Project project, String commitMessage, final String patch, Repository[] repositories, int possibleRepoIndex) {
        super(project);
        setTitle("Post Review");
        this.project = project;
        summaryTextField.setText(commitMessage);
        newRequestRadioButton.setSelected(true);
        reviewIdTextField.setEnabled(false);
        loadReviewButton.setEnabled(false);
        newRequestRadioButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                reviewIdTextField.setEnabled(false);
                loadReviewButton.setEnabled(false);
            }
        });
        existingRequestRadioButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                reviewIdTextField.setEnabled(true);
                loadReviewButton.setEnabled(true);
            }
        });

        for (Repository repo : repositories) {
            comboBoxRepository.addItem(new RepoComboItem(repo));
        }
        if (possibleRepoIndex > -1) {
            comboBoxRepository.setSelectedIndex(possibleRepoIndex);
        }


        setOKButtonText("Post");
        init();
        showDiffButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JDialog dialog = new JDialog((Dialog) null, true);
                dialog.setTitle("Diff");
                dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                diffTextArea = new JTextArea(patch);
                JScrollPane sp = new JScrollPane(diffTextArea);
                dialog.add(sp);
                dialog.setSize(800, 600);
                dialog.setLocationRelativeTo(PrePostReviewForm.this.getPreviewComponent());
                dialog.setVisible(true);
            }
        });
        loadReviewButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                final String reviewId = reviewIdTextField.getText();
                if (reviewId == null || "".equals(reviewId)) {
                    Messages.showWarningDialog(project, "Please fill review request id", null);
                    reviewIdTextField.grabFocus();
                    return;
                }
                try {
                    final ReviewSettings setting = getSetting();
                    if (setting == null) {
                        return;
                    }

                    Task.Backgroundable task = new Task.Backgroundable(project, "Load review details", false, new PerformInBackgroundOption() {
                        @Override
                        public boolean shouldStartInBackground() {
                            return false;
                        }

                        @Override
                        public void processSentToBackground() {
                        }
                    }) {

                        @Override
                        public void run(@NotNull ProgressIndicator progressIndicator) {
                            progressIndicator.setIndeterminate(true);
                            try {
                                ReviewBoardClient.loadReview(setting, reviewId);
                            } catch (Exception e1) {
                                Messages.showErrorDialog("No such review id:" + reviewId, "Error");
                                return;
                            }
                            if (setting.getSummary() != null) {
                                summaryTextField.setText(setting.getSummary());
                            }
                            if (setting.getDescription() != null) {
                                descTextArea.setText(setting.getDescription());
                            }
                            if (setting.getBranch() != null) {
                                branchTextField.setText(setting.getBranch());
                            }
                            if (setting.getBugsClosed() != null) {
                                bugTextField.setText(setting.getBugsClosed());
                            }
                            if (setting.getPeople() != null) {
                                peopleTextField.setText(setting.getPeople());
                            }
                            if (setting.getGroup() != null) {
                                groupTextField.setText(setting.getGroup());
                            }
                        }
                    };
                    ProgressManager.getInstance().run(task);

                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        });
    }

    @Override
    public boolean isOKActionEnabled() {
        peopleTextField.addCurrentTextToHistory();
        groupTextField.addCurrentTextToHistory();
        if (reviewIdTextField.isEnabled()) {
            String reviewId = reviewIdTextField.getText();
            if (reviewId == null || "".equals(reviewId)) {
                Messages.showWarningDialog(project, "Please fill review request id", null);
                reviewIdTextField.grabFocus();
                return false;
            }
        }
        return true;
    }

    public JComponent getPreviewComponent() {
        return rootContainer;
    }

    public String getDiff() {
        if (diffTextArea != null) {
            return diffTextArea.getText();
        } else {
            return null;
        }
    }

    public ReviewSettings getSetting() {
        ReviewSettings settings = new ReviewSettings();
        //from ui
        if (reviewIdTextField.isEnabled()) {
            settings.setReviewId(reviewIdTextField.getText());
        }
        settings.setSummary(summaryTextField.getText());
        settings.setBranch(branchTextField.getText());
        settings.setBugsClosed(bugTextField.getText());
        settings.setGroup(groupTextField.getText());
        settings.setPeople(peopleTextField.getText());
        settings.setDescription(descTextArea.getText());
        settings.setRepoId(((RepoComboItem) comboBoxRepository.getSelectedItem()).repo.id);
//        if (settings.getServer() == null || "".equals(settings.getServer())) {
//            Messages.showMessageDialog(project, "Please set the review board server address in config panel", "Info", null);
//            return null;
//        }
//        if (settings.getUsername() == null || "".equals(settings.getUsername())) {
//            Messages.showMessageDialog(project, "Please set the review board user name in config panel", "Info", null);
//            return null;
//        }
//        if (settings.getPassword() == null || "".equals(settings.getPassword())) {
//            JPasswordField pf = new JPasswordField();
//            pf.grabFocus();
//            int okCxl = JOptionPane.showConfirmDialog(null, pf, "Enter Password", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
//
//            if (okCxl == JOptionPane.OK_OPTION) {
//                String password = new String(pf.getPassword());
//                settings.setPassword(password);
//            } else {
//                return null;
//            }
//        }
        return settings;
    }

    @Override
    protected JComponent createCenterPanel() {
        return getPreviewComponent();
    }

    private void createUIComponents() {
        peopleTextField = new TextFieldWithStoredHistory("rb.people");

//        peopleTextField.addKeyboardListener(new KeyAdapter() {
//            @Override
//            public void keyTyped(KeyEvent e) {
//                System.out.println(e);
//                if (e.getKeyCode() == KeyEvent.VK_DELETE) {
//                    peopleTextField.setSelectedIndex(-1);
////                    peopleTextField
//                }
//            }
//        });
        groupTextField = new TextFieldWithStoredHistory("rb.group");
    }
}