/*
 * 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.jena.fuseki.main;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import org.apache.http.entity.EntityTemplate;
import org.apache.jena.atlas.web.WebLib;
import org.apache.jena.graph.Graph;
import org.apache.jena.rdfconnection.RDFConnection;
import org.apache.jena.rdfconnection.RDFConnectionFactory;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.web.HttpCaptureResponse;
import org.apache.jena.riot.web.HttpOp;
import org.apache.jena.riot.web.HttpResponseLib;
import org.apache.jena.shacl.ValidationReport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class TestFusekiShaclValidation {
    // Fuseki Main server
    private static FusekiServer server = null;
    private static String serverURL = null;
    private static final String DIR = "testing/ShaclValidation/";
    
    @BeforeClass 
    public static void beforeClass() {
        int port = WebLib.choosePort();

        FusekiServer server = FusekiServer.create()
            .port(port)
            .parseConfigFile(DIR+"config-validation.ttl")
            .build();
        server.start();
        serverURL = "http://localhost:"+port;
    }
    
    @AfterClass
    public static void afterClass() {
        if ( server != null )
            server.stop();
    }
    
    @Test
    public void shacl_empty_shapes() {
        try ( RDFConnection conn = RDFConnectionFactory.connect(serverURL+"/ds")) {
            conn.put(DIR+"data1.ttl");
            ValidationReport report = validateReport(serverURL+"/ds/shacl?graph=default", DIR+"shapes-empty.ttl");
            assertNotNull(report);
            assertEquals(0, report.getEntries().size());
            conn.update("CLEAR ALL");
        }
    }
    
    @Test
    public void shacl_default_graph() {
        try ( RDFConnection conn = RDFConnectionFactory.connect(serverURL+"/ds")) {
            conn.put(DIR+"data1.ttl");
            
            ValidationReport report = validateReport(serverURL+"/ds/shacl?graph=default", DIR+"shapes1.ttl");
            assertNotNull(report);
            assertEquals(2, report.getEntries().size());
            
            ValidationReport report2 = validateReport(serverURL+"/ds/shacl?graph=urn:x:noGraph", DIR+"shapes1.ttl");
            assertNotNull(report);
            assertEquals(0, report2.getEntries().size());
            conn.update("CLEAR ALL");
        }
    }

    @Test
    public void shacl_no_data_graph() {
        try ( RDFConnection conn = RDFConnectionFactory.connect(serverURL+"/ds")) {
            conn.put(DIR+"data1.ttl");
            ValidationReport report = validateReport(serverURL+"/ds/shacl?graph=urn:x:noGraph", DIR+"shapes1.ttl");
            assertNotNull(report);
            assertEquals(0, report.getEntries().size());
            conn.update("CLEAR ALL");
        }
    }

    @Test
    public void shacl_union_1() {
        try ( RDFConnection conn = RDFConnectionFactory.connect(serverURL+"/ds")) {
            conn.put(DIR+"data1.ttl");
            ValidationReport report = validateReport(serverURL+"/ds/shacl?graph=union", DIR+"shapes1.ttl");
            assertNotNull(report);
            // Union does not include the storage default graph
            assertEquals(0, report.getEntries().size());
            conn.update("CLEAR ALL");
        }
    }

    @Test
    public void shacl_union_2() {
        try ( RDFConnection conn = RDFConnectionFactory.connect(serverURL+"/ds")) {
            conn.put("urn:abc:graph", DIR+"data1.ttl");
            ValidationReport report = validateReport(serverURL+"/ds/shacl?graph=union", DIR+"shapes1.ttl");
            assertNotNull(report);
            assertEquals(2, report.getEntries().size());
            conn.update("CLEAR ALL");
        }
    }

    @Test
    public void shacl_named_graph() {
        try ( RDFConnection conn = RDFConnectionFactory.connect(serverURL+"/ds")) {
            conn.put("urn:abc:graph", DIR+"data1.ttl");
            ValidationReport report = validateReport(serverURL+"/ds/shacl?graph=urn:abc:graph", DIR+"shapes1.ttl");
            assertNotNull(report);
            assertEquals(2, report.getEntries().size());
            conn.update("CLEAR ALL");
        }
    }

    private static ValidationReport validateReport(String url, String shapesFile) {
        Graph shapesGraph = RDFDataMgr.loadGraph(shapesFile);
        EntityTemplate entity = new EntityTemplate((out)->RDFDataMgr.write(out, shapesGraph, Lang.TTL));
        String ct = Lang.TTL.getContentType().getContentTypeStr();
        entity.setContentType(ct);

        HttpCaptureResponse<Graph> graphResponse = HttpResponseLib.graphHandler();
        HttpOp.execHttpPost(url, entity, "*/*", graphResponse);
        return ValidationReport.fromGraph(graphResponse.get());
    }
}
