/*
 * 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.camel.quarkus.component.pdf.it;

import java.net.URI;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.camel.ProducerTemplate;
import org.apache.camel.component.pdf.PdfHeaderConstants;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.jboss.logging.Logger;

@Path("/pdf")
@ApplicationScoped
public class PdfResource {

    private static final Logger LOG = Logger.getLogger(PdfResource.class);

    @Inject
    ProducerTemplate producerTemplate;

    private byte[] document;

    @Path("/createFromText")
    @POST
    @Consumes(MediaType.TEXT_PLAIN)
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response createFromText(String message) throws Exception {
        document = producerTemplate.requestBody(
                "pdf:create?fontSize=6&pageSize=PAGE_SIZE_A5&font=Courier", message, byte[].class);

        LOG.infof("The PDDocument has been created and contains %d bytes", document.length);

        return Response.created(new URI("pdf/extractText")).entity(document).build();
    }

    @Path("/appendText")
    @PUT
    @Consumes(MediaType.TEXT_PLAIN)
    @Produces(MediaType.APPLICATION_OCTET_STREAM)
    public Response appendText(String message) throws Exception {
        document = producerTemplate.requestBodyAndHeader("pdf:append", message,
                PdfHeaderConstants.PDF_DOCUMENT_HEADER_NAME, PDDocument.load(document), byte[].class);

        LOG.infof("The PDDocument has been updated and now contains %d bytes", document.length);

        return Response.ok().entity(document).build();
    }

    @Path("/extractText")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String get() throws Exception {
        LOG.info("Extracting text from the PDDocument");
        return producerTemplate.requestBody("pdf:extractText", PDDocument.load(document), String.class);
    }
}
