package testing;

import io.avaje.http.client.BodyAdapter;
import io.avaje.http.client.BodyReader;
import io.avaje.http.client.BodyWriter;
import io.avaje.http.client.HttpClient;
import io.avaje.http.client.JsonbBodyAdapter;
import io.avaje.jsonb.Types;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;

class MappingTest {

  @Test
  void fails() {
    final HttpClient httpClient =
        HttpClient.builder().baseUrl("https://gist.githubusercontent.com").build();

    TestClient client = httpClient.create(TestClient.class);
    Map<String, List<TestRecord>> result = client.get();
    System.out.println(result);
  }

  @Test
  void success() {
    BodyAdapter fakeAdapter =
        new BodyAdapter() {
          private JsonbBodyAdapter delegate = new JsonbBodyAdapter();

          @Override
          public <T> BodyWriter<T> beanWriter(Class<?> type) {
            return delegate.beanWriter(type);
          }

          @Override
          public <T> BodyReader<T> beanReader(Class<T> type) {
            return delegate.beanReader(type);
          }

          @Override
          public <T> BodyReader<T> beanReader(Type type) {
            if (type.toString().contains("java.util.List, testing.TestRecord")) {
              ParameterizedType adjusted = Types.mapOf(Types.listOf(TestRecord.class));
              return delegate.beanReader(adjusted);
            }
            return delegate.beanReader(type);
          }

          @Override
          public <T> BodyReader<List<T>> listReader(Class<T> type) {
            return delegate.listReader(type);
          }
        };
    final HttpClient httpClient =
        HttpClient.builder()
            .baseUrl("https://gist.githubusercontent.com")
            .bodyAdapter(fakeAdapter)
            .build();

    TestClient client = httpClient.create(TestClient.class);
    Map<String, List<TestRecord>> result = client.get();
    System.out.println(result);
  }
}
