package com.google.lizlooney.shoppinglist;

import java.util.List;
import java.util.TreeSet;

/**
 * Class maintaining the set of all aisles.
 *
 * @author lizlooney@gmail.com (Liz Looney)
 */
public final class Aisles {
  private final Object lock = new Object();
  private final TreeSet<String> aisles = new TreeSet<>();

  public void loadAisles(List<Item> items) {
    synchronized (lock) {
      // Loads the aisles TreeSet with the aisles that are used in the items.
      clear();
      for (Item item: items) {
        add(item);
      }
    }
  }

  public void clear() {
    synchronized (lock) {
      aisles.clear();
    }
  }

  public void add(Item newItem) {
    synchronized (lock) {
      for (String aisle : newItem.getAisles()) {
        aisles.add(aisle);
      }
    }
  }

  public String[] getAislesArray() {
    synchronized (lock) {
      return aisles.toArray(new String[0]);
    }
  }
}
