package rb;

import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vfs.VirtualFile;
import git4idea.GitUtil;
import git4idea.commands.GitCommand;
import git4idea.commands.GitSimpleHandler;
import git4idea.repo.GitRepository;

import java.util.Arrays;

/**
 * Created by IntelliJ IDEA.
 * User: gongze
 * Date: 3/21/2015
 * Time: 4:08 PM
 */
public class GitVCSBuilder implements VCSBuilder {

    private AbstractVcs vcs;
    private String repositoryURL;
    private String diff;
    private VirtualFile workingCopy;

    public GitVCSBuilder(AbstractVcs vcs) {
        this.vcs = vcs;
    }

    @Override
    public AbstractVcs getVCS() {
        return vcs;
    }

    @Override
    public String getDiff() {
        return diff;
    }

    @Override
    public String getRepositoryURL() {
        return repositoryURL;
    }

    @Override
    public String getBasePath() {
        return "";
    }

    public void build(Project project, VirtualFile[] vFiles) {
        getRepositoryRoot(project, vFiles);
        diff = generateDiff(project, workingCopy, vFiles);
    }

    private void getRepositoryRoot(Project project, VirtualFile[] vFiles) {
        for (VirtualFile vf : vFiles) {
            if (vf != null) {
                vf.refresh(false, true);
                GitRepository repositoryForFile = GitUtil.getRepositoryManager(project).getRepositoryForFile(vf);
                assert repositoryForFile != null;
                repositoryURL = repositoryForFile.getRemotes().iterator().next().getFirstUrl();
                workingCopy = repositoryForFile.getRoot();
                break;
            }
        }

    }

    private String generateDiff(Project project, VirtualFile root, VirtualFile[] vFiles) {
        try {
            ApplicationManager.getApplication().runWriteAction(new Runnable() {
                public void run() {
                    FileDocumentManager.getInstance().saveAllDocuments();
                }
            });
            GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.DIFF);
            handler.addParameters("HEAD");
            handler.setSilent(true);
            handler.setStdoutSuppressed(true);
            handler.addRelativeFiles(Arrays.asList(vFiles));
            System.out.println(handler.printableCommandLine());
            return handler.run();
        } catch (Exception e) {
            Messages.showWarningDialog("Svn is still in refresh. Please try again later.", "Alter");
        }
        return null;
    }
}