package com.airlock.iam.admin.application.service.settings.provider;

import com.airlock.iam.admin.application.configuration.logviewer.ColoringRule;
import com.airlock.iam.admin.application.configuration.logviewer.FilterPattern;
import com.airlock.iam.admin.application.configuration.logviewer.LogFile;
import com.airlock.iam.admin.application.configuration.logviewer.LogViewer;
import com.airlock.iam.admin.application.service.SettingsProvider;
import com.airlock.iam.admin.application.service.settings.LogviewerSettings;
import com.airlock.iam.admin.application.service.settings.Settings;
import com.airlock.iam.admin.application.system.AdminappPage;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class LogviewerSettingsProvider implements SettingsProvider {
   private final Optional<LogViewer> logviewer;

   @Override
   public AdminappPage page() {
      return AdminappPage.LOGS;
   }

   @Override
   public Optional<Settings> getSettings() {
      if (this.logviewer.isEmpty()) {
         return Optional.empty();
      }

      LogViewer config = this.logviewer.get();
      List<LogviewerSettings.LogviewerFilter> filters = config.getLogFiles().stream().map(LogviewerSettingsProvider::toFilter).collect(Collectors.toList());
      List<LogviewerSettings.LogviewerColorRule> colors = config.getColorScheme()
         .stream()
         .map(LogviewerSettingsProvider::toColorRule)
         .collect(Collectors.toList());
      LogviewerSettings.LogviewerSettingsBuilder builder = LogviewerSettings.builder();
      builder.filters(filters).colors(colors).defaultConfigContextIdentifier("[DEFAULT]").defaultApplication(config.getInitiallySelectedLogFile().orElse(null));
      return Optional.of(builder.build());
   }

   private static LogviewerSettings.LogviewerFilter toFilter(LogFile logFile) {
      List<LogviewerSettings.LogviewerPredefinedFilter> predefinedFilters = logFile.getFilterPatterns()
         .stream()
         .map(LogviewerSettingsProvider::toPredefinedFilter)
         .collect(Collectors.toList());
      return LogviewerSettings.LogviewerFilter.builder().key(logFile.getNameTranslationKey()).predefinedFilters(predefinedFilters).build();
   }

   private static LogviewerSettings.LogviewerColorRule toColorRule(ColoringRule rule) {
      return LogviewerSettings.LogviewerColorRule.builder()
         .pattern(rule.getPattern().pattern())
         .foregroundColor(rule.getForegroundColor())
         .backgroundColor(rule.getBackgroundColor())
         .metaForegroundColor(rule.getForegroundColorForMetaData())
         .build();
   }

   private static LogviewerSettings.LogviewerPredefinedFilter toPredefinedFilter(FilterPattern filter) {
      return LogviewerSettings.LogviewerPredefinedFilter.builder().key(filter.getNameTranslationKey()).filter(filter.getPattern().pattern()).build();
   }

   @SuppressFBWarnings(justification = "generated code")
   public LogviewerSettingsProvider(Optional<LogViewer> logviewer) {
      this.logviewer = logviewer;
   }
}
