package com.google.typography.font.compression;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * Compression stats, both aggregate and per font.
 *
 * @author David Kuettel
 */
public class CompressionStats {

  public enum Size { ORIGINAL, GZIP, WOFF2 }

  private final List<Stats> values = Lists.newArrayList();

  public void add(Stats stat) {
    values.add(stat);
  }

  public List<Stats> values() {
    return values;
  }

  public double mean(Size size) {
    double sum = 0;
    for (Long value : values(size)) {
      sum += value;
    }
    return sum / values.size();
  }

  public double median(Size size) {
    List<Long> list = values(size);
    Collections.sort(list);
    int length = list.size();
    if (length % 2 == 1) {
      return list.get((length - 1) / 2);
    } else {
      return 0.5 * (list.get(length / 2 - 1) + list.get(length / 2));
    }
  }

  private List<Long> values(Size size) {
    List<Long> list = Lists.newArrayList();
    for (Stats stats : values) {
      list.add(stats.getSize(size));
    }
    return list;
  }

  public static class Stats {

    private final String filename;
    private final Map<Size, Long> sizes;

    private Stats(String filename, Map<Size, Long> sizes) {
      this.filename = filename;
      this.sizes = sizes;
    }

    public String getFilename() {
      return filename;
    }

    public long getSize(Size size) {
      return sizes.get(size);
    }

    public static Builder builder() {
      return new Builder();
    }

    public static class Builder {

      private String filename;
      private Map<Size, Long> sizes = Maps.newHashMap();

      public Builder setFilename(String filename) {
        this.filename = filename;
        return this;
      }

      public Builder setSize(Size key, long value) {
        this.sizes.put(key, value);
        return this;
      }

      public Stats build() {
        return new Stats(filename, ImmutableMap.copyOf(sizes));
      }
    }
  }
}
