defmodule Util.TimeStamp do

  @moduledoc false
  # Utility functions for generating timestamps.

  @doc "Return the current timestamp."
  def timestamp_now do
    {time, _} = System.cmd("date", ["+%Y %m %d %H %M %S"])
    [y,m,d,hh,mm,ss] = time |> String.split |> Enum.map(&String.to_integer/1)
    {{y,m,d},{hh,mm,ss}}
  end

  @doc "Return a timestamp for a specific filepath."
  def filepath_timestamp(path) do
    epath = Path.expand(path)
    case File.stat(epath, time: :local) do
      {:ok, info} -> Map.get(info, :mtime)
      _           -> {{0,0,0},{0,0,0}}
    end
  end

#  @doc """
#  Return a timestamp for a specific directory.
#
#  Timestamp is the most recently modified file under the directory.
#  """
#  def dirpath_timestamp(dirpath) do
#    Path.expand(dirpath)
#    |> Util.Ext.File.ls_r
#    |> Enum.map(fn(path) -> filepath_timestamp(path) end)
#    |> Enum.max
#  end

#  @doc """
#  Return a timestamp for a list of directories.
#
#  Timestamp is the most recently modified file for all sub-directories.
#  """
#  def dirlist_timestamp(dirlist) do
#    dirlist
#    |> Enum.map(fn(x) -> Path.expand(x) end)
#    |> Enum.map(fn(x) -> dirpath_timestamp(x) end)
#    |> newest
#  end

#  @doc """
#  Return a timestamp for a mixed list of files and directories.
#  """
#  def mixlist_timestamp(list) do
#    new_list = List.flatten(list)
#    dirs  = Enum.filter(new_list, fn(el) -> File.dir?(el) end) |> List.flatten
#    files = new_list -- dirs
#    newest_file = Enum.map(files, fn(file) -> filepath_timestamp(file) end) |> newest
#    newest_dir  = dirlist_timestamp(dirs)
#    List.flatten([newest_file, newest_dir]) |> newest
#  end

  @doc """
  Timestamp 'newer' comparison predicate

  Example:

  iex> {{2012,2,5},{12,12,12}} |> is_newer_than? {{2014,9,9},{4,4,4}}
  false
  """
  def is_newer_than?(ts1, ts2), do: ts1 >= ts2

  @doc """
  Timestamp 'older' comparison predicate

  Example:

  iex> {{2012,2,5},{12,12,12}} |> is_older_than? {{2014,9,9},{4,4,4}}
  true
  """
  def is_older_than?(ts1, ts2), do: ts1  < ts2

  @doc "Returns the newest timestamp in a list."
  def newest([]), do: {{2000,0,0},{0,0,0}}
  def newest(enum), do: Enum.max(enum)

  @doc "Returns the oldest timestamp in a list."
  def oldest(enum), do: Enum.min(enum)
  end
