package com.github.hykes.codegen.provider;

import com.github.hykes.codegen.utils.StringUtils;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.PlainTextFileType;
import com.intellij.openapi.project.Project;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 文件提供者工厂
 * @author [email protected]
 * @date 2017/3/17
 */
public class FileProviderFactory {

    private final Project project;
    private final String outputPath;
    public FileProviderFactory(Project project, String outputPath) {
        this.project = project;
        this.outputPath = outputPath;
    }

    /**
     * 内置的文件类型
     */
    private static Map<String, FileType> FILE_TYPES = new ConcurrentHashMap<>();
    static {
        FileTypeManager manager = FileTypeManager.getInstance();
        // 预制, 目测可以删除
        FILE_TYPES.put("java", manager.getStdFileType("JAVA"));
        FILE_TYPES.put("js", manager.getStdFileType("JavaScript"));
        FILE_TYPES.put("css", manager.getStdFileType("CSS"));
        FILE_TYPES.put("html", manager.getStdFileType("HTML"));
        FILE_TYPES.put("xhtml", manager.getStdFileType("XHTML"));
        FILE_TYPES.put("json", manager.getStdFileType("JSON"));
        FILE_TYPES.put("jsp", manager.getStdFileType("JSP"));
        FILE_TYPES.put("jspx", manager.getStdFileType("JSPX"));
        FILE_TYPES.put("xml", manager.getStdFileType("XML"));
        FILE_TYPES.put("dtd", manager.getStdFileType("DTD"));
        FILE_TYPES.put("properties", manager.getStdFileType("Properties"));
        FILE_TYPES.put("manifest", manager.getStdFileType("Manifest"));
        FILE_TYPES.put("txt", manager.getStdFileType("PLAIN_TEXT"));
        FILE_TYPES.put("sql", manager.getStdFileType("SQL"));
        FILE_TYPES.put("kt", manager.getStdFileType("Kotlin"));
    }

    /**
     * 根据文件后缀获取文件类型
     */
    public static FileType getFileType(String suffix) {
        if (StringUtils.isBlank(suffix)) {
            return PlainTextFileType.INSTANCE;
        }
        String extension = suffix.toLowerCase();
        FileType fileType = FILE_TYPES.get(extension);
        if (fileType == null) {
            for (FileType ft : FileTypeManager.getInstance().getRegisteredFileTypes()) {
                if (extension.equals(ft.getDefaultExtension())) {
                    fileType = ft;
                    FILE_TYPES.put(extension, ft);
                    break;
                }
            }
        }
        return StringUtils.nullOr(fileType, PlainTextFileType.INSTANCE);
    }

    public AbstractFileProvider getInstance(String type) {
        return new DefaultProviderImpl(project, outputPath, getFileType(type));
    }
}