/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~ 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.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

import org.apache.sling.api.resource.type.ResourceType;
import org.apache.sling.scriptingbundle.plugin.capability.ProvidedResourceTypeCapability;
import org.apache.sling.scriptingbundle.plugin.capability.RequiredResourceTypeCapability;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.VersionRange;

public class FileProcessorTest {

    private FileProcessor processor;
    Set<ProvidedResourceTypeCapability> providedCapabilities;
    Set<RequiredResourceTypeCapability> requiredCapabilities;
    private static final ResourceType MY_RESOURCE_TYPE = ResourceType.parseResourceType("apps/my/resource");

    @Before
    public void setUp() {
        processor = new FileProcessor(new Slf4jLogger(), Constants.DEFAULT_SEARCH_PATHS, Constants.DEFAULT_EXTENSION_TO_SCRIPT_ENGINE_MAPPING);
        providedCapabilities = new HashSet<>();
        requiredCapabilities = new HashSet<>();
    }

    @Test
    public void testExtendsValid() {
        Path extendsFile = Paths.get("src", "test", "resources", "extends", "valid");
        processor.processExtendsFile(MY_RESOURCE_TYPE, extendsFile, providedCapabilities, requiredCapabilities);
        Assert.assertEquals(1, requiredCapabilities.size());
        RequiredResourceTypeCapability expectedRequiredCapability = RequiredResourceTypeCapability.builder()
                .withResourceType("org/apache/sling/bar")
                .withVersionRange(new VersionRange("[1.0.0,2.0.0)"))
                .withIsOptional().build();
        Assert.assertEquals(expectedRequiredCapability, requiredCapabilities.iterator().next());
        Assert.assertEquals(1, providedCapabilities.size());
        ProvidedResourceTypeCapability expectedProvidedCapability = ProvidedResourceTypeCapability.builder()
                .withResourceTypes(new HashSet<>(Arrays.asList("my/resource", "/apps/my/resource")))
                .withVersion(MY_RESOURCE_TYPE.getVersion())
                .withExtendsResourceType("org/apache/sling/bar")
                .build();
        Assert.assertEquals(expectedProvidedCapability, providedCapabilities.iterator().next());
    }

    @Test
    public void testExtendsMultipleClauses() {
        Path extendsFile = Paths.get("src", "test", "resources", "extends", "multiple-clauses");
        Assert.assertThrows(IllegalArgumentException.class, () -> { processor.processExtendsFile(MY_RESOURCE_TYPE, extendsFile, providedCapabilities, requiredCapabilities); });
    }

    @Test
    public void testExtendsInvalidAttributes() {
        Path extendsFile = Paths.get("src", "test", "resources", "extends", "invalid-attributes");
        Assert.assertThrows(IllegalArgumentException.class, () -> { processor.processExtendsFile(MY_RESOURCE_TYPE, extendsFile, providedCapabilities, requiredCapabilities); });
    }

    @Test
    public void testExtendsMultipleLines() {
        Path extendsFile = Paths.get("src", "test", "resources", "extends", "multiple-lines");
        Assert.assertThrows(IllegalArgumentException.class, () -> { processor.processExtendsFile(MY_RESOURCE_TYPE, extendsFile, providedCapabilities, requiredCapabilities); });
    }

    @Test
    public void testRequiresValid() {
        Path requiresFile = Paths.get("src", "test", "resources", "requires", "valid");
        processor.processRequiresFile(requiresFile, requiredCapabilities);
        Assert.assertEquals(1, requiredCapabilities.size());
        RequiredResourceTypeCapability expectedCapability = RequiredResourceTypeCapability.builder()
                .withResourceType("org/apache/sling/bar")
                .withVersionRange(new VersionRange("[1.0.0,2.0.0)"))
                .withIsOptional().build();
        Assert.assertEquals(expectedCapability, requiredCapabilities.iterator().next());
    }

    @Test
    public void testRequiresMultipleClauses() {
        Path requiresFile = Paths.get("src", "test", "resources", "requires", "multiple-clauses");
        Assert.assertThrows(IllegalArgumentException.class, () -> { processor.processRequiresFile(requiresFile, requiredCapabilities); });
    }

    @Test
    public void testRequiresInvalidAttributes() {
        Path requiresFile = Paths.get("src", "test", "resources", "extends", "invalid-attributes");
        Assert.assertThrows(IllegalArgumentException.class, () -> { processor.processRequiresFile(requiresFile, requiredCapabilities); });
    }

    @Test
    public void testScriptValid() {
        Path resourceTypeFolder = Paths.get("apps", "my", "resource", "2.0");
        Path script = Paths.get("apps", "my", "resource", "2.0", "selectorb", "selectora.POST.html");
        processor.processScriptFile(resourceTypeFolder, script, MY_RESOURCE_TYPE, providedCapabilities, false);
        Assert.assertEquals(1, providedCapabilities.size());
        ProvidedResourceTypeCapability expectedProvidedCapability = ProvidedResourceTypeCapability.builder()
                .withResourceTypes(new HashSet<>(Arrays.asList("my/resource", "/apps/my/resource")))
                .withVersion(MY_RESOURCE_TYPE.getVersion())
                .withRequestMethod("POST")
                .withSelectors(Arrays.asList("selectorb", "selectora"))
                .withScriptEngine("htl")
                .withScriptExtension("html")
                .build();
        Assert.assertEquals(expectedProvidedCapability, providedCapabilities.iterator().next());
    }

    @Test
    public void testScriptUnknownExtension() {
        Path resourceTypeFolder = Paths.get("scripts",  "apps", "my", "resource", "2.0");
        Path script = Paths.get("scripts", "apps", "my", "resource", "2.0", "selectorb", "selectora.POST.abc");
        processor.processScriptFile(resourceTypeFolder, script, MY_RESOURCE_TYPE, providedCapabilities, false);
        // this must not throw an exception but a WARN should be emitted in the log to make users aware of potential misconfigurations
        Assert.assertEquals(0, providedCapabilities.size());
    }
}
