/*
 * 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.batchee.jaxrs.server;

import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
import org.apache.batchee.jaxrs.common.JBatchResource;
import org.apache.batchee.jaxrs.common.RestEntry;
import org.apache.batchee.jaxrs.common.RestJobExecution;
import org.apache.batchee.jaxrs.common.RestJobInstance;
import org.apache.batchee.jaxrs.common.RestProperties;
import org.apache.batchee.jaxrs.common.RestStepExecution;
import org.apache.batchee.jaxrs.server.util.CreateSomeJobs;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxrs.client.WebClient;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OverProtocol;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;
import org.jboss.shrinkwrap.descriptor.api.webapp30.WebAppDescriptor;
import org.junit.Test;
import org.junit.runner.RunWith;

import javax.batch.runtime.BatchStatus;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.net.URL;
import java.util.Arrays;

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

@RunWith(Arquillian.class)
public class RestTest {
    @ArquillianResource
    private URL base;

    @Test
    public void getJobNames() {
        final String[] jobNames = newClient().path("job-names").get(String[].class);
        assertNotNull(jobNames);
        assertEquals(1, jobNames.length);
        assertEquals("init", jobNames[0]);
    }

    @Test
    public void getJobInstanceCount() {
        final int count = newClient().path("job-instance/count/{id}", "init").get(Integer.class);
        assertEquals(1, count);
    }

    @Test
    public void getJobInstances() {
        final RestJobInstance[] instances = newClient().path("job-instances/{name}", "init").query("start", 0).query("count", 10).get(RestJobInstance[].class);
        assertNotNull(instances);
        assertEquals(1, instances.length);
        assertEquals(0, instances[0].getId());
        assertEquals("init", instances[0].getName());
    }

    @Test
    public void getRunningExecutions() {
        final int status = newClient().path("executions/running/{name}", "init").get().getStatus();
        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), status); // no more running so exception
    }

    @Test
    public void getJobInstance() {
        final RestJobInstance instance = newClient().path("job-instance/{id}", 0).get(RestJobInstance.class);
        assertNotNull(instance);
        assertEquals(0, instance.getId());
        assertEquals("init", instance.getName());
    }

    @Test
    public void getParameters() {
        final RestProperties params = newClient().path("execution/parameter/{id}", 0).get(RestProperties.class);
        assertNotNull(params);
        assertEquals(1, params.getEntries().size());

        final RestEntry entry = params.getEntries().iterator().next();
        assertEquals("test", entry.getKey());
        assertEquals("jbatch", entry.getValue());
    }

    @Test
    public void getJobExecutions() {
        final RestJobExecution[] executions = newClient().path("job-executions/{id}/{name}", 0, "init").get(RestJobExecution[].class);
        assertNotNull(executions);
        assertEquals(1, executions.length);
        assertEquals(0, executions[0].getId());
        assertEquals("init", executions[0].getName());
        assertEquals("COMPLETED", executions[0].getExitStatus());
        assertEquals(BatchStatus.COMPLETED, executions[0].getBatchStatus());
    }

    @Test
    public void getJobExecution() {
        final RestJobExecution executions = newClient().path("job-execution/{id}", 0).get(RestJobExecution.class);
        assertNotNull(executions);
        assertEquals(0, executions.getId());
        assertEquals("init", executions.getName());
        assertEquals("COMPLETED", executions.getExitStatus());
        assertEquals(BatchStatus.COMPLETED, executions.getBatchStatus());
    }

    @Test
    public void getStepExecutions() {
        final RestStepExecution[] executions = newClient().path("step-executions/{id}", 0).get(RestStepExecution[].class);
        assertNotNull(executions);
        assertEquals(1, executions.length);
        assertEquals(0, executions[0].getId());
        assertEquals("step1", executions[0].getName());
        assertEquals("OK", executions[0].getExitStatus());
        assertEquals(BatchStatus.COMPLETED, executions[0].getBatchStatus());
    }

    @Deployment(testable = false)
    @OverProtocol("Servlet 2.5") // to use a custom web.xml
    public static Archive<?> war() {
        return ShrinkWrap.create(WebArchive.class, "batchee-gui.war")
            // GUI
            .addPackages(true, JBatchResourceImpl.class.getPackage())
            .addPackages(true, JBatchResource.class.getPackage())
            .addAsWebInfResource(new StringAsset(
                Descriptors.create(WebAppDescriptor.class)
                    .metadataComplete(false)
                    .createServlet()
                    .servletName("CXF")
                    .servletClass("org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet")
                    .createInitParam()
                    .paramName("jaxrs.serviceClasses")
                    .paramValue(JBatchResourceImpl.class.getName())
                    .up()
                    .createInitParam()
                    .paramName("jaxrs.providers")
                    .paramValue("com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider," + JBatchExceptionMapper.class.getName())
                    .up()
                    .createInitParam()
                    .paramName("jaxrs.outInterceptors")
                    .paramValue(LoggingOutInterceptor.class.getName())
                    .up()
                    .up()
                    .createServletMapping()
                    .servletName("CXF")
                    .urlPattern("/api/*")
                    .up()
                    .exportAsString()
            ), "web.xml")
            // test data to create some job things to do this test
            .addPackage(CreateSomeJobs.class.getPackage())
            .addAsWebInfResource("META-INF/batch-jobs/init.xml", "classes/META-INF/batch-jobs/init.xml");
    }

    private WebClient newClient() {
        return WebClient.create(base.toExternalForm() + "api/batchee", Arrays.asList(new JacksonJsonProvider())).accept(MediaType.APPLICATION_JSON_TYPE);
    }
}
