package pro.opcode.bitrix;

import com.intellij.ProjectTopics;
import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.ide.fileTemplates.FileTemplateManager;
import com.intellij.openapi.components.ProjectComponent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootEvent;
import com.intellij.openapi.roots.ModuleRootListener;
import com.intellij.openapi.util.IconLoader;
import com.intellij.util.ResourceUtil;
import org.jetbrains.annotations.NotNull;

import javax.swing.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Optional;

public class BitrixFramework implements ProjectComponent, ModuleRootListener {
	public static final Icon bxIcon;

	private final Project project;
//	public static VirtualFile[] projectSourceRoots = new VirtualFile[]{};
//	public static VirtualFile[] projectResourceRoots = new VirtualFile[]{};
	private static final HashMap<String, String> templates = new HashMap<>();

	static {
		bxIcon = IconLoader.getIcon("/pro/opcode/bitrix/resources/icon.bx.png");

		templates.put("Битрикс - Страница", "bxSimplePage");
		templates.put("Битрикс - Страница (модерн)", "bxSimplePageModern");
		templates.put("Битрикс - Сервис", "bxSimpleService");
		templates.put("Битрикс - Раздел (настройки)", "bxSimpleSectionConfig");
		templates.put("Битрикс - Раздел (титульная)", "bxSimpleSectionIndex");
	}

	public BitrixFramework(@NotNull Project project) {
		this.project = project;
	}

	@Override
	public void projectOpened() {
//		projectSourceRoots = ProjectRootManager.getInstance(project).getContentSourceRoots();
//		for (VirtualFile resourceRoot : WebResourcesPathsConfiguration.getInstance(project).getResourceDirectories()) {
//			projectResourceRoots = Arrays.copyOf(projectResourceRoots, projectResourceRoots.length + 1);
//			projectResourceRoots[projectResourceRoots.length - 1] = resourceRoot;
//		}
		project.getMessageBus().connect(project).subscribe(ProjectTopics.PROJECT_ROOTS, this);

		/* Шаблоны страниц */
		FileTemplateManager templateManager = FileTemplateManager.getInstance(project);

		for (String templateName : templates.keySet()) {
			if (null == templateManager.findInternalTemplate(templateName)) {
				Optional<String> content = getResourceFileContent(
					"fileTemplates/" + templates.get(templateName) + ".php.ft");

				if (content.isPresent()) {
					FileTemplate template
						= templateManager.addTemplate(templateName, "php");

					template.setText(content.get());
					template.setReformatCode(true);
				}
			}
		}
	}

	@Override
	public void projectClosed() {
	}

	@Override
	public void initComponent() {
	}

	@Override
	public void disposeComponent() {
	}

	@NotNull
	@Override
	public String getComponentName() {
		return "BitrixFramework";
	}

	@Override
	public void beforeRootsChange(ModuleRootEvent moduleRootEvent) {
	}

	@Override
	public void rootsChanged(ModuleRootEvent moduleRootEvent) {
//		projectSourceRoots = ProjectRootManager.getInstance(project).getContentSourceRoots();
//		projectResourceRoots = new VirtualFile[0];
//		for (VirtualFile resourceRoot : WebResourcesPathsConfiguration.getInstance(project).getResourceDirectories()) {
//			projectResourceRoots = Arrays.copyOf(projectResourceRoots, projectResourceRoots.length + 1);
//			projectResourceRoots[projectResourceRoots.length - 1] = resourceRoot;
//		}
	}

	@NotNull
	private Optional<String> getResourceFileContent(@NotNull String resourceFilePath) {
		try {
			return Optional.of(ResourceUtil.loadText(BitrixFramework.class.getResource(
				"/pro/opcode/bitrix/resources/" + resourceFilePath
			)));
		}
		catch (IOException e) {
			return Optional.empty();
		}
	}
}