package org.jboss.resteasy.test.stream.resource;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;

import org.jboss.resteasy.annotations.Stream;

import io.reactivex.Flowable;

@Path("")
public class StreamRawFlowableRxJava2Resource {

    @GET
    @Path("byte/default")
    @Produces("application/octet-stream;x=y")
    @Stream(Stream.MODE.RAW)
    public Flowable<Byte> aByteDefault() {
        return Flowable.fromArray((byte) 0, (byte) 1, (byte) 2);
    }

    @GET
    @Path("byte/false")
    @Produces("application/octet-stream;x=y")
    @Stream(value = Stream.MODE.RAW, includeStreaming = false)
    public Flowable<Byte> aByteFalse() {
        return Flowable.fromArray((byte) 0, (byte) 1, (byte) 2);
    }

    @GET
    @Path("byte/true")
    @Produces("application/octet-stream;x=y")
    @Stream(value = Stream.MODE.RAW, includeStreaming = true)
    public Flowable<Byte> aByteTrue() {
        return Flowable.fromArray((byte) 0, (byte) 1, (byte) 2);
    }

    @GET
    @Path("bytes/default")
    @Produces("application/octet-stream;x=y")
    @Stream(Stream.MODE.RAW)
    public Flowable<byte[]> bytesDefault() {
        byte[] bytes = new byte[] { 0, 1, 2 };
        return Flowable.fromArray(bytes, bytes, bytes);
    }

    @GET
    @Path("bytes/false")
    @Produces("application/octet-stream;x=y")
    @Stream(value = Stream.MODE.RAW, includeStreaming = false)
    public Flowable<byte[]> bytesFalse() {
        byte[] bytes = new byte[] { 0, 1, 2 };
        return Flowable.fromArray(bytes, bytes, bytes);
    }

    @GET
    @Path("bytes/true")
    @Produces("application/octet-stream;x=y")
    @Stream(value = Stream.MODE.RAW, includeStreaming = true)
    public Flowable<byte[]> bytesTrue() {
        byte[] bytes = new byte[] { 0, 1, 2 };
        return Flowable.fromArray(bytes, bytes, bytes);
    }

    @GET
    @Path("char/default")
    @Produces("text/plain;charset=UTF-8")
    @Stream(Stream.MODE.RAW)
    public Flowable<Character> aCharDefault() {
        return Flowable.fromArray('a', 'b', 'c');
    }

    @GET
    @Path("char/false")
    @Produces("text/plain;charset=UTF-8")
    @Stream(value = Stream.MODE.RAW, includeStreaming = false)
    public Flowable<Character> aCharFalse() {
        return Flowable.fromArray('a', 'b', 'c');
    }

    @GET
    @Path("char/true")
    @Produces("text/plain;charset=UTF-8")
    @Stream(value = Stream.MODE.RAW, includeStreaming = true)
    public Flowable<Character> aCharTrue() {
        return Flowable.fromArray('a', 'b', 'c');
    }

    @GET
    @Path("chars/default")
    @Produces("text/plain;charset=UTF-8")
    @Stream(Stream.MODE.RAW)
    public Flowable<Character[]> charsDefault() {
        Character[] chars = new Character[] { 'a', 'b', 'c' };
        return Flowable.fromArray(chars, chars, chars);
    }

    @GET
    @Path("chars/false")
    @Produces("text/plain;charset=UTF-8")
    @Stream(value = Stream.MODE.RAW, includeStreaming = false)
    public Flowable<Character[]> charsFalse() {
        Character[] chars = new Character[] { 'a', 'b', 'c' };
        return Flowable.fromArray(chars, chars, chars);
    }

    @GET
    @Path("chars/true")
    @Produces("text/plain;charset=UTF-8")
    @Stream(value = Stream.MODE.RAW, includeStreaming = true)
    public Flowable<Character[]> charsTrue() {
        Character[] chars = new Character[] { 'a', 'b', 'c' };
        return Flowable.fromArray(chars, chars, chars);
    }
}
