lib/trifle/stats/configuration.ex

defmodule Trifle.Stats.Configuration do
  defstruct driver: nil, ranges: [:minute, :hour, :day, :week, :month, :quarter, :year], separator: "::", time_zone: "GMT", time_zone_database: nil, beginning_of_week: :monday

  def configure(driver, time_zone \\ "GMT", time_zone_database \\ nil, beginning_of_week \\ :monday, track_ranges \\ [:minute, :hour, :day, :week, :month, :quarter, :year], separator \\ "::") do
    %Trifle.Stats.Configuration{
      driver: driver,
      time_zone: time_zone,
      time_zone_database: time_zone_database,
      beginning_of_week: beginning_of_week,
      ranges: MapSet.intersection(MapSet.new(track_ranges), MapSet.new([:minute, :hour, :day, :week, :month, :quarter, :year])),
      separator: separator
    }
  end

  def set_time_zone(%Trifle.Stats.Configuration{} = configuration, time_zone) do
    %{configuration | time_zone: time_zone}
  end

  def set_time_zone_database(%Trifle.Stats.Configuration{} = configuration, time_zone_database) do
    %{configuration | time_zone_database: time_zone_database}
  end

  def set_beginning_of_week(%Trifle.Stats.Configuration{} = configuration, beginning_of_week) do
    %{configuration | beginning_of_week: beginning_of_week}
  end

  def set_ranges(%Trifle.Stats.Configuration{} = configuration, track_ranges) do
    %{configuration | ranges: MapSet.intersection(MapSet.new(track_ranges), MapSet.new([:minute, :hour, :day, :week, :month, :quarter, :year]))}
  end

  def set_separator(%Trifle.Stats.Configuration{} = configuration, separator) do
    %{configuration | separator: separator}
  end
end