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

import com.airlock.iam.common.api.domain.model.geolocation.Geolocation;
import com.airlock.iam.common.api.domain.model.request.IpAddress;
import com.airlock.iam.common.api.domain.model.request.RequestAttributes;
import com.airlock.iam.common.domain.model.geolocation.GeolocationProvider;
import com.airlock.iam.common.domain.model.request.RequestAttributesImpl;
import com.airlock.iam.core.domain.model.header.HttpHeader;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import jakarta.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.apache.commons.collections4.EnumerationUtils;

public class RequestAttributeExtractor {
   private static final ELogger LOG = ELoggerFactory.getLogger(RequestAttributeExtractor.class);

   public RequestAttributes extractRequestAttributes(HttpServletRequest request, IpAddress ip, Optional<GeolocationProvider> geolocationProvider) {
      Optional<Geolocation> geolocation = Optional.empty();
      if (geolocationProvider.isPresent()) {
         geolocation = geolocationProvider.get().determineGeolocation(ip);
         if (geolocation.isPresent()) {
            LOG.info("Determined geolocation of IP " + ip.value() + ": " + geolocation.get().toLogString());
         }
      }

      List<HttpHeader> headers = new ArrayList<>();

      for (String headerName : EnumerationUtils.toList(request.getHeaderNames())) {
         headers.add(new HttpHeader(headerName, request.getHeader(headerName)));
      }

      return new RequestAttributesImpl(ip, headers, geolocation);
   }
}
