package floobits.utilities;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ContentIterator;
import com.intellij.openapi.vfs.VFileProperty;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import floobits.FloobitsPlugin;
import floobits.common.*;
import floobits.common.interfaces.IContext;
import floobits.common.interfaces.IFile;
import floobits.impl.FileImpl;
import javax.swing.event.HyperlinkEvent;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
public class IntelliUtils {
public static ArrayList<String> getAllNestedFilePaths(VirtualFile vFile) {
final ArrayList<String> filePaths = new ArrayList<String>();
if (!vFile.isDirectory()) {
filePaths.add(vFile.getPath());
return filePaths;
}
VfsUtil.iterateChildrenRecursively(vFile, null, new ContentIterator() {
@Override
public boolean processFile(VirtualFile file) {
if (!file.isDirectory()) {
filePaths.add(file.getPath());
}
return true;
}
});
return filePaths;
}
public static ArrayList<IFile> getAllValidNestedFiles(final IContext context, VirtualFile vFile) {
final ArrayList<IFile> virtualFiles = new ArrayList<IFile>();
FileImpl fileImpl = new FileImpl(vFile);
if (!fileImpl.isDirectory()) {
if (fileImpl.isValid() && !context.isIgnored(fileImpl)) virtualFiles.add(fileImpl);
return virtualFiles;
}
VfsUtil.iterateChildrenRecursively(vFile, null, new ContentIterator() {
@Override
public boolean processFile(VirtualFile file) {
FileImpl fileImpl = new FileImpl(file);
if (!context.isIgnored(fileImpl) && !fileImpl.isDirectory() && fileImpl.isValid()) {
virtualFiles.add(fileImpl);
}
return true;
}
});
return virtualFiles;
}
public static Boolean isSharable(VirtualFile virtualFile) {
return (virtualFile != null && virtualFile.isValid() && virtualFile.isInLocalFileSystem() && !virtualFile.is(VFileProperty.SPECIAL) && !virtualFile.is(VFileProperty.SYMLINK));
}
public static Boolean isAutoGenerated() {
PersistentJson p = PersistentJson.getInstance();
return p.auto_generated_account;
}
public static String getCompleteSignUpURL(Project project) {
if (project == null) {
return null;
}
if (!Settings.canFloobits()) {
Flog.errorMessage("Error, no account details detected. You will have to sign up manually.", project);
return null;
}
if(!BrowserOpener.getInstance().isBrowserSupported()) {
Flog.errorMessage("Can't use a browser on this system.", project);
return null;
}
HashMap<String, HashMap<String, String>> auth;
try {
auth = Settings.get().auth;
} catch (Throwable e1) {
Flog.errorMessage("Invalid JSON in ~/.floorc.json", project);
return null;
}
if (auth.size() < 1) {
Flog.error("No auth.");
return null;
}
String host;
if (auth.size() > 1) {
host = Constants.floobitsDomain;
} else {
host = (String) auth.keySet().toArray()[0];
}
HashMap<String, String> hostAuth = auth.get(host);
if (hostAuth == null) {
Flog.error("This probably shouldn't happen, but there is no auth.");
return null;
}
String username = hostAuth.get("username");
if (username == null) {
Flog.error("This probably shouldn't happen, but there is no username.");
return null;
}
String secret = hostAuth.get("secret");
return String.format("https://%s/%s/pinocchio/%s", host, username, secret);
}
public static void handleHyperLink(HyperlinkEvent event, Project project) {
if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
URI uri;
try {
uri = event.getURL().toURI();
} catch (URISyntaxException error) {
Flog.error(error);
return;
}
FloobitsPlugin plugin = FloobitsPlugin.getInstance(project);
if (!BrowserOpener.getInstance().openInBrowser(uri, "Click to continue.", plugin.context)) {
plugin.context.errorMessage(
String.format("You cannot click on links in IntelliJ apparently, try copy and paste: %s.", uri.toString()));
}
}
}
}