package com.airlock.iam.servicecontainer.app.domain.service.usertraillog;

import com.airlock.iam.base.api.domain.model.exception.FailureException;
import com.airlock.iam.common.domain.model.logs.Log;
import com.airlock.iam.common.domain.service.logs.LogParser;
import com.airlock.iam.common.domain.service.logs.UserTrailLogParserHelper;
import com.airlock.iam.log.usertrail.UserTrailLog;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;

public final class UserTrailLogParserService implements UserTrailLogParser {
   private final LogParser logParser;

   @Override
   public List<UserTrailLog> parse(List<String> unparsedLines) {
      List<String> filteredLines = filterOutBlankLines(unparsedLines);

      try {
         List<Log> logs = this.logParser.parse(filteredLines);
         return mapLogsToUserTrailLogs(logs);
      } catch (RuntimeException e) {
         throw new FailureException(String.format("Error while parsing user trail log line: %s", e.getMessage()));
      }
   }

   private static List<String> filterOutBlankLines(List<String> unparsedLines) {
      return unparsedLines.stream().filter(line -> !line.isBlank()).toList();
   }

   private static List<UserTrailLog> mapLogsToUserTrailLogs(List<Log> logs) {
      return logs.stream().<UserTrailLog>map(UserTrailLogParserHelper::mapToUserTrailLog).toList();
   }

   @SuppressFBWarnings(justification = "generated code")
   public UserTrailLogParserService(LogParser logParser) {
      this.logParser = logParser;
   }
}
