package com.airlock.iam.oauth2.infrastructure.request;

import com.airlock.iam.base.api.infrastructure.uri.ExternalUriInfo;
import com.airlock.iam.oauth2.api.domain.model.http.OAuth2HttpRequest;
import jakarta.servlet.http.HttpServletRequest;
import java.net.URI;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Optional;

public class OAuth2HttpServletRequestWrapper implements OAuth2HttpRequest {
   private final HttpServletRequest request;
   private final ExternalUriInfo externalUriInfo;

   public OAuth2HttpServletRequestWrapper(HttpServletRequest request, ExternalUriInfo externalUriInfo) {
      this.request = request;
      this.externalUriInfo = externalUriInfo;
   }

   @Override
   public OAuth2HttpRequest.Method getMethod() {
      return OAuth2HttpRequest.Method.valueOf(this.request.getMethod());
   }

   @Override
   public URI getRequestUri() {
      return this.externalUriInfo.getRequestUri();
   }

   @Override
   public Collection<String> getParameterNames() {
      return Collections.list(this.request.getParameterNames());
   }

   @Override
   public Optional<String> getParameter(String name) {
      return Optional.ofNullable(this.request.getParameter(name));
   }

   @Override
   public Collection<String> getParameters(String name) {
      return Optional.ofNullable(this.request.getParameterValues(name)).map(array -> Arrays.stream(array).toList()).orElse(Collections.emptyList());
   }

   @Override
   public Collection<String> getHeaderNames() {
      return Collections.list(this.request.getHeaderNames());
   }

   @Override
   public Optional<String> getHeader(String name) {
      return Optional.ofNullable(this.request.getHeader(name));
   }

   @Override
   public Collection<String> getHeaders(String name) {
      return Collections.list(this.request.getHeaders(name));
   }
}
