package krasa.formatter.settings.provider;

import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.PathUtil;
import krasa.formatter.common.ModifiableFile;
import krasa.formatter.plugin.InvalidPropertyFile;
import krasa.formatter.settings.Settings;
import krasa.formatter.utils.FileUtils;

import java.io.File;
import java.util.Properties;

/**
 * @author Vojtech Krasa
 */
public class JavaPropertiesProvider extends CachedPropertiesProvider {
	protected String profile;


	public JavaPropertiesProvider(Settings settings) {
		this(settings.getPathToConfigFileJava(), settings.getSelectedJavaProfile());
	}

	public JavaPropertiesProvider(String pathToConfigFileJava, String selectedJavaProfile) {
		super(new ModifiableFile(pathToConfigFileJava));
		this.profile = selectedJavaProfile;
	}

	@Override
	protected Properties readFile(File file) throws InvalidPropertyFile {
		if (file.getName().toLowerCase().endsWith("xml")) {
			return readXmlFile(file, profile);
		} else if (file.getName().toLowerCase().endsWith("epf")) {
			return readWorkspaceMechanicFile(file);
		} else if (file.getName().toLowerCase().equals("org.eclipse.jdt.ui.prefs")) {
			return readWorkspaceFile(file);
		} else {
			// org.eclipse.jdt.core.prefs
			return super.readFile(file);
		}
	}

	private Properties readWorkspaceFile(File file) {
		Properties properties = FileUtils.readPropertiesFile(file);
		String xml = properties.getProperty("org.eclipse.jdt.ui.formatterprofiles");
		Properties result = FileUtils.readXmlJavaSettingsFile(xml, properties, profile);
		trimTrailingWhitespaceFromConfigValues(result);
		validateConfig(result, file);
		return result;
	}

	private Properties readWorkspaceMechanicFile(final File file) {
		Properties properties = FileUtils.readPropertiesFile(file);
		Properties result = FileUtils.convertEPF(properties, createDefaultConfig());
		validateConfig(result, file);
		return result;
	}

	public boolean isSameFile(VirtualFile fileB) {
		String path = PathUtil.toSystemIndependentName(fileB.getPath());
		String current = getModifiableFile().getSystemIndependentPath();
		return current.equals(path);
	}

}