/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~ Licensed to the Apache Software Foundation (ASF) under one
 ~ or more contributor license agreements.  See the NOTICE file
 ~ distributed with this work for additional information
 ~ regarding copyright ownership.  The ASF licenses this file
 ~ to you under the Apache License, Version 2.0 (the
 ~ "License"); you may not use this file except in compliance
 ~ with the License.  You may obtain a copy of the License at
 ~
 ~   http://www.apache.org/licenses/LICENSE-2.0
 ~
 ~ Unless required by applicable law or agreed to in writing,
 ~ software distributed under the License is distributed on an
 ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 ~ KIND, either express or implied.  See the License for the
 ~ specific language governing permissions and limitations
 ~ under the License.
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
package org.apache.sling.scriptingbundle.plugin.processor;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.sling.scriptingbundle.plugin.capability.Capabilities;
import org.apache.sling.scriptingbundle.plugin.capability.ProvidedScriptCapability;
import org.apache.sling.scriptingbundle.plugin.capability.RequiredResourceTypeCapability;
import org.jetbrains.annotations.NotNull;

public class PathOnlyScriptAnalyser {

    private final Path scriptsDirectory;
    private final Predicate<Path> isNotAResourceTypeFolder;
    private final Map<String, String> scriptEngineMappings;
    private final FileProcessor fileProcessor;

    public PathOnlyScriptAnalyser(@NotNull Logger logger, @NotNull Path scriptsDirectory, @NotNull Map<String, String> scriptEngineMappings,
                                  @NotNull FileProcessor fileProcessor) {
        this.scriptsDirectory = scriptsDirectory;
        this.isNotAResourceTypeFolder = new ResourceTypeFolderPredicate(logger).negate();
        this.scriptEngineMappings = scriptEngineMappings;
        this.fileProcessor = fileProcessor;
    }

    public @NotNull Capabilities getProvidedScriptCapability(@NotNull Path file) {
        if (Files.isRegularFile(file) && file.startsWith(scriptsDirectory)) {
            String filePath = file.toString();
            String extension = FilenameUtils.getExtension(filePath);
            if (StringUtils.isNotEmpty(extension) && scriptEngineMappings.containsKey(extension)) {
                boolean useFile = true;
                Path parent = file.getParent();
                Path loopParent = parent;
                while (useFile && loopParent != null && !loopParent.equals(scriptsDirectory)) {
                    useFile = isNotAResourceTypeFolder.test(loopParent);
                    loopParent = loopParent.getParent();
                }
                if (parent != null && useFile) {
                    Path fileName = file.getFileName();
                    if (fileName != null) {
                        String name = fileName.toString();
                        int dotLastIndex = name.lastIndexOf('.');
                        if (dotLastIndex > -1 && dotLastIndex != name.length() - 1) {
                            String scriptPath = FilenameUtils.normalize("/" + scriptsDirectory.relativize(file).toString(), true);
                            ProvidedScriptCapability providedScriptCapability =
                                    ProvidedScriptCapability.builder(scriptEngineMappings).withPath(scriptPath).build();
                            Path requires = parent.resolve(Constants.REQUIRES_FILE);
                            Set<RequiredResourceTypeCapability> requiredCapabilities = new HashSet<>();
                            if (Files.exists(requires)) {
                                fileProcessor.processRequiresFile(requires, requiredCapabilities);
                            }
                            return new Capabilities(Collections.emptySet(),
                                    new HashSet<>(Arrays.asList(providedScriptCapability)),
                                    requiredCapabilities);
                        }
                    }
                }
            }
        }
        return Capabilities.EMPTY;
    }
}
