package com.yutou.okhttp.converter;

import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonWriter;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okio.Buffer;
import org.jetbrains.annotations.Nullable;
import retrofit2.Converter;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class JsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
    Gson gson;
    TypeAdapter<T> adapter;
    public JsonRequestBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson=gson;
        this.adapter=adapter;
    }

    @Nullable
    @Override
    public RequestBody convert(T value) throws IOException {
        Buffer buffer = new Buffer();
        Writer writer = new OutputStreamWriter(buffer.outputStream(), StandardCharsets.UTF_8);
        JsonWriter jsonWriter = gson.newJsonWriter(writer);
        adapter.write(jsonWriter, value);
        jsonWriter.close();
        byte[] bytes = buffer.readByteArray();
        return RequestBody.create(MediaType.parse("application/json; charset=UTF-8"),bytes );
    }
}