defmodule Jump.CLI do def main(args \\ []) do parsed_args = parse_args(args) parsed_args |> fetch() |> calculate(parsed_args) |> finish() end defp parse_args(args) do {opts, _, _} = OptionParser.parse(args, switches: [article: :string, days: :integer]) opts end defp fetch(args) do format = &Calendar.strftime(&1, "%Y%m%d") now = DateTime.utc_now() the_end = format.(now) {the_end_int, ""} = Integer.parse(the_end) start = now |> DateTime.add(-4, :day) |> format.() Jump.fetch(args[:article], start, the_end_int) end defp calculate(items, args) do total_pageviews = Enum.sum_by(items, &Map.get(&1, "views")) max_views_item = Enum.max_by(items, &Map.get(&1, "views")) %{ event_name: "campaign_spike_conversion", article: args[:article], window_days: args[:days], total_pageviews: total_pageviews, avg_daily_pageviews: total_pageviews / length(items), top_day: %{ date: max_views_item["timestamp"], pageviews: max_views_item["views"] } } end defp finish(summary) do %{status: status, body: %{"data" => data}} = Jump.post(summary) IO.puts("Summary:") IO.inspect(summary) IO.puts(""" \nPost Response (Status #{status}): #{inspect(data)} """) IO.puts("done.") end end