package org.jboss.resteasy.test.providers.mediatype.resource;

import java.io.ByteArrayInputStream;
import java.io.CharArrayReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;

import jakarta.activation.DataSource;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.WebApplicationException;
import jakarta.ws.rs.core.StreamingOutput;

import org.jboss.resteasy.plugins.providers.FileRange;
import org.jboss.resteasy.security.smime.EnvelopedOutput;
import org.jboss.resteasy.test.crypto.resource.CryptoCertResource;
import org.jboss.resteasy.test.providers.mediatype.BlacklistedMediaTypeTest;

@Path("")
public class BlacklistedMediaTypeResource {

    @GET
    @Path("byteArrayProvider")
    public byte[] byteArray() {
        return "hello".getBytes();
    }

    @GET
    @Path("dataSourceProvider")
    public DataSource dataSource() {
        return new DataSource() {
            @Override
            public InputStream getInputStream() throws IOException {
                return new ByteArrayInputStream("hello".getBytes());
            }

            @Override
            public OutputStream getOutputStream() throws IOException {
                throw new IOException();
            }

            @Override
            public String getContentType() {
                return "application/octet-stream";
            }

            @Override
            public String getName() {
                return "test";
            }
        };
    }

    @GET
    @Path("envelopedWriter")
    public EnvelopedOutput envelopedWriter() throws Exception {
        EnvelopedOutput eo = new EnvelopedOutput("hello", "text/plain");
        eo.setCertificate(CryptoCertResource.cert);
        return eo;
    }

    @GET
    @Path("fileProvider")
    public File fileProvider() throws Exception {
        String url = "src/test/resources/" +
                BlacklistedMediaTypeTest.class.getPackage().getName().replace('.', File.separatorChar) +
                "/BlacklistedMediaTypeFile1";
        File file = new File(url);
        return file;
    }

    @GET
    @Path("fileRangeWriter")
    public FileRange fileRangeWriter() throws Exception {
        String url = "src/test/resources/" +
                BlacklistedMediaTypeTest.class.getPackage().getName().replace('.', File.separatorChar) +
                "/BlacklistedMediaTypeFile2";
        File file = new File(url);
        FileRange fileRange = new FileRange(file, 2, 6);
        return fileRange;
    }

    @GET
    @Path("inputStreamProvider")
    public InputStream inputStreamProvider() throws Exception {
        ByteArrayInputStream baos = new ByteArrayInputStream("hello".getBytes());
        return baos;
    }

    @GET
    @Path("readerProvider")
    public Reader readerProvider() throws Exception {
        return new CharArrayReader("hello".toCharArray());
    }

    @GET
    @Path("streamingOutputProvider")
    public StreamingOutput streamingOutputProvider() throws Exception {
        return new StreamingOutput() {

            @Override
            public void write(OutputStream outputStream) throws IOException, WebApplicationException {
                outputStream.write("hello".getBytes());
            }
        };
    }

    @GET
    @Path("stringTextStar")
    public String str() {
        return "hello";
    }
}
