package org.apache.freemarker.generator.cli.config;

import freemarker.cache.TemplateLoader;
import org.apache.freemarker.generator.base.document.DocumentsSupplier;
import org.apache.freemarker.generator.base.file.PropertiesClassPathSupplier;
import org.apache.freemarker.generator.base.file.PropertiesFileSystemSupplier;
import org.apache.freemarker.generator.base.file.PropertiesSupplier;

import java.util.function.Supplier;

/**
 * Convenience methods to create suppliers.
 */
public class Suppliers {

    public static ConfigurationSupplier configurationSupplier(Settings settings) {
        return new ConfigurationSupplier(settings, templateLoaderSupplier(settings));
    }

    public static ConfigurationSupplier configurationSupplier(Settings settings, Supplier<TemplateLoader> templateLoader) {
        return new ConfigurationSupplier(settings, templateLoader);
    }

    public static TemplateDirectorySupplier templateDirectorySupplier(String userDefinedTemplateDir) {
        return new TemplateDirectorySupplier(userDefinedTemplateDir);
    }

    public static TemplateLoaderSupplier templateLoaderSupplier(Settings settings) {
        return new TemplateLoaderSupplier(settings.getTemplateDirectories());
    }

    public static ToolsSupplier toolsSupplier(Settings settings) {
        return new ToolsSupplier(settings.getConfiguration(), settings.toMap());
    }

    public static DocumentsSupplier documentsSupplier(Settings settings) {
        return new DocumentsSupplier(settings.getSources(),
                settings.getInclude(),
                settings.getExclude(),
                settings.getInputEncoding());
    }

    public static PropertiesSupplier propertiesSupplier(String fileName) {
        return new PropertiesSupplier(
                new PropertiesFileSystemSupplier(fileName),
                new PropertiesClassPathSupplier(fileName));
    }
}