package com.xiaohansong.codemaker;

import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.DataKeys;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.xiaohansong.codemaker.util.CodeMakerUtil;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.nio.charset.UnsupportedCharsetException;

/**
 * @author hansong.xhs
 * @version $Id: CreateFileAction.java, v 0.1 2017-01-21 11:44 hansong.xhs Exp $$
 */
public class CreateFileAction implements Runnable {

    /**
     * logger
     */
    private static final Logger LOGGER = CodeMakerUtil.getLogger(CreateFileAction.class);

    private String outputFile;

    private String content;

    private String fileEncoding;

    private DataContext dataContext;

    public CreateFileAction(String outputFile, String content, String fileEncoding, DataContext dataContext) {
        this.outputFile = outputFile;
        this.content = content;
        this.fileEncoding = fileEncoding;
        this.dataContext = dataContext;
    }

    @Override
    public void run() {
        try {
            VirtualFileManager manager = VirtualFileManager.getInstance();
            VirtualFile virtualFile = manager
                    .refreshAndFindFileByUrl(VfsUtil.pathToUrl(outputFile));

            if (virtualFile != null && virtualFile.exists()) {
                virtualFile.setBinaryContent(content.getBytes(fileEncoding));
            } else {
                File file = new File(outputFile);
                FileUtils.writeStringToFile(file, content, fileEncoding);
                virtualFile = manager.refreshAndFindFileByUrl(VfsUtil.pathToUrl(outputFile));
            }
            VirtualFile finalVirtualFile = virtualFile;
            Project project = DataKeys.PROJECT.getData(dataContext);
            if (finalVirtualFile == null || project == null) {
                LOGGER.error(this);
                return;
            }
            ApplicationManager.getApplication()
                    .invokeLater(
                            () -> FileEditorManager.getInstance(project).openFile(finalVirtualFile, true,
                                    true));

        } catch (UnsupportedCharsetException ex) {
            ApplicationManager.getApplication().invokeLater(() -> Messages.showMessageDialog("Unknown Charset: " + fileEncoding + ", please use the correct charset", "Generate Failed", null));
        } catch (Exception e) {
            LOGGER.error("Create file failed", e);
        }

    }
}