package com.airlock.iam.admin.application.service.logs;

import com.airlock.iam.common.domain.model.logs.Log;
import com.airlock.iam.common.domain.model.logs.LogSignatureVerification;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

class LogComparator implements Comparator<Log> {
   private final LogSort sortBy;
   private final boolean ascending;

   public int compare(Log first, Log second) {
      int comparison = 0;
      if (this.sortBy == LogSort.TIMESTAMP) {
         comparison = this.compareDate(first.getTimestamp(), second.getTimestamp());
      }

      if (this.sortBy == LogSort.MESSAGE) {
         comparison = this.compareMessage(first.getMessageLines(), second.getMessageLines());
      }

      if (this.sortBy == LogSort.SIGNATURE) {
         comparison = this.compareSingature(first.getSignatureVerification(), second.getSignatureVerification());
      }

      return comparison * (this.ascending ? 1 : -1);
   }

   private int compareDate(Date first, Date second) {
      if (first == null && second == null) {
         return 0;
      } else if (first == null) {
         return 1;
      } else {
         return second == null ? -1 : first.compareTo(second);
      }
   }

   private int compareMessage(List<String> firstList, List<String> secondList) {
      int comparison = 0;
      Iterator<String> first = firstList.iterator();
      Iterator<String> second = secondList.iterator();

      while (first.hasNext() && second.hasNext() && comparison == 0) {
         comparison = first.next().compareToIgnoreCase(second.next());
      }

      return comparison;
   }

   private int compareSingature(LogSignatureVerification first, LogSignatureVerification second) {
      return first.compareTo(second);
   }

   @SuppressFBWarnings(justification = "generated code")
   public LogComparator(LogSort sortBy, boolean ascending) {
      this.sortBy = sortBy;
      this.ascending = ascending;
   }
}
