package org.infinispan.xsite.status;

import java.util.LinkedList;
import java.util.List;

/**
 * A {@link SiteStatus} builder based on its online and offline members.
 *
 * @author Pedro Ruivo
 * @since 8.2
 * @private
 */
public abstract class AbstractSiteStatusBuilder<E> {

   private final List<E> onlineElements;
   private final List<E> offlineElements;

   protected AbstractSiteStatusBuilder() {
      offlineElements = new LinkedList<>();
      onlineElements = new LinkedList<>();
   }

   /**
    * Adds the element with an online connection to the site.
    *
    * @param member The member.
    */
   public final void onlineOn(E member) {
      onlineElements.add(member);
   }

   /**
    * Adds the member with an offline connection to the site.
    *
    * @param member The member.
    */
   public final void offlineOn(E member) {
      offlineElements.add(member);
   }

   /**
    * @return {@link SiteStatus} created.
    */
   public final SiteStatus build() {
      if (isOnline()) {
         return OnlineSiteStatus.getInstance();
      } else if (isOffline()) {
         return OfflineSiteStatus.getInstance();
      } else {
         return createMixedStatus(onlineElements, offlineElements);
      }
   }

   protected boolean isOnline() {
      return !onlineElements.isEmpty() && offlineElements.isEmpty();
   }

   protected boolean isOffline() {
      return onlineElements.isEmpty() && !offlineElements.isEmpty();
   }

   protected abstract SiteStatus createMixedStatus(List<E> onlineElements, List<E> offlineElements);

}
