package org.yaoqiang.bpmn.intellij.xml;

import com.intellij.openapi.module.Module;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.xml.XmlFile;
import com.intellij.xml.XmlSchemaProvider;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.yaoqiang.bpmn.intellij.editor.BPMNFileTypeFactory;
import org.yaoqiang.model.bpmn.BPMNModelConstants;

import java.net.URL;

/**
 * Created by Blenta on 5/31/2017.
 */
public class BPMNFileSchemaProvider extends XmlSchemaProvider {

    @Override
    public boolean isAvailable(final @NotNull XmlFile file) {
        return BPMNFileTypeFactory.isBPMN(file);
    }

    @Nullable
    @Override
    public XmlFile getSchema(@NotNull @NonNls String url, @Nullable Module module, @NotNull PsiFile baseFile) {
        return module != null && BPMNFileTypeFactory.isBPMN(baseFile) ? getReference(url, module) : null;
    }

    private static XmlFile getReference(@NotNull @NonNls String url, @NotNull Module module) {
        if (url.equalsIgnoreCase("http://bpmn.sourceforge.net")) {
            return null;
        }
        final URL resource = BPMNFileSchemaProvider.class.getResource(BPMNModelConstants.BPMN_SCHEMA_BASEURI + BPMNModelConstants.BPMN_SYSTEM_ID);
        final VirtualFile fileByURL = VfsUtil.findFileByURL(resource);
        if (fileByURL == null) {
            return null;
        }

        PsiFile psiFile = PsiManager.getInstance(module.getProject()).findFile(fileByURL);
        return (XmlFile) psiFile.copy();
    }

}