package com.airlock.iam.application.webserver.infrastructure.logs;

import com.airlock.iam.elog.api.EDefaultLogType;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Optional;

public final class WebserverLogSerializer {
   private static final ELogger ERROR_LOGGER = ELoggerFactory.getLogger(WebserverLogSerializer.class);
   private static final ObjectMapper JSON_OBJECT_MAPPER = setupJsonObjectMapper();
   private static final DateTimeFormatter ISO_8601_NO_COLON_IN_OFFSET = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ").withLocale(Locale.ROOT);

   public static Optional<String> writeLogAsJsonString(Object logEntry) {
      try {
         return Optional.of(JSON_OBJECT_MAPPER.writeValueAsString(logEntry));
      } catch (JsonProcessingException e) {
         ERROR_LOGGER.error(EDefaultLogType.GENERIC_LOG_TYPE, "Failed to serialize the log message to json:" + logEntry.toString(), e);
         return Optional.empty();
      }
   }

   public static String instantToIso8601Timestamp(Instant time) {
      return ZonedDateTime.ofInstant(time, ZoneId.systemDefault()).format(ISO_8601_NO_COLON_IN_OFFSET);
   }

   private static ObjectMapper setupJsonObjectMapper() {
      ObjectMapper jsonMapper = new ObjectMapper();
      jsonMapper.setDefaultPropertyInclusion(Include.NON_NULL);
      return jsonMapper;
   }

   private WebserverLogSerializer() {
      throw new AssertionError();
   }
}
