package de.espend.idea.php.quality.psalm.configuration;

import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.NullableFunction;
import com.jetbrains.php.tools.quality.QualityToolConfigurationProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
 * @author Daniel Espendiller <[email protected]>
 */
public abstract class PsalmValidatorConfigurationProvider extends QualityToolConfigurationProvider<PsalmValidatorConfiguration> {
    private static final ExtensionPointName<PsalmValidatorConfigurationProvider> EP_NAME = ExtensionPointName.create("de.espend.idea.php.quality.psalm.psalmConfigurationProvider");

    @Nullable
    public static PsalmValidatorConfigurationProvider getInstances() {
        // make org.jetbrains.plugins.phpstorm-remote-interpreter optional; like done by PhpStorm implementations
        PsalmValidatorConfigurationProvider[] extensions = EP_NAME.getExtensions();
        if (extensions.length > 1) {
            throw new RuntimeException("Several providers for remote Psalm configuration was found");
        }

        return extensions.length == 1 ? extensions[0] : null;
    }

    protected void fillSettingsByDefaultValue(@NotNull PsalmValidatorConfiguration settings, @NotNull PsalmValidatorConfiguration localConfiguration, @NotNull NullableFunction<String, String> preparePath) {
        super.fillSettingsByDefaultValue(settings, localConfiguration, preparePath);

        String toolPath = preparePath.fun(localConfiguration.getToolPath());
        if (StringUtil.isNotEmpty(toolPath)) {
            settings.setToolPath(toolPath);
        }

        settings.setTimeout(localConfiguration.getTimeout());
    }
}