defmodule Mix.Tasks.DownloadCountryDatabase do
  @moduledoc """
  This task downloads the Country Lite database from DB-IP for self-hosted or development purposes.
  Plausible Cloud runs a paid version of DB-IP with more detailed geolocation data.
  """

  use Mix.Task
  use Plausible.Repo
  require Logger

  # coveralls-ignore-start

  def run(_) do
    Application.ensure_all_started(:httpoison)
    Application.ensure_all_started(:timex)
    this_month = Date.utc_today()
    last_month = Date.shift(this_month, month: -1)
    this_month = this_month |> Date.to_iso8601() |> binary_part(0, 7)
    last_month = last_month |> Date.to_iso8601() |> binary_part(0, 7)
    this_month_url = "https://download.db-ip.com/free/dbip-country-lite-#{this_month}.mmdb.gz"
    last_month_url = "https://download.db-ip.com/free/dbip-country-lite-#{last_month}.mmdb.gz"
    Logger.notice("Downloading #{this_month_url}")
    res = HTTPoison.get!(this_month_url)

    res =
      case res.status_code do
        404 ->
          Logger.warning("Got 404 for #{this_month_url}, trying #{last_month_url}")
          HTTPoison.get!(last_month_url)

        _ ->
          res
      end

    if res.status_code == 200 do
      File.mkdir("priv/geodb")
      File.write!("priv/geodb/dbip-country.mmdb.gz", res.body)
      Logger.notice("Downloaded and saved the database successfully")
    else
      Logger.error("Unable to download and save the database. Response: #{inspect(res)}")
    end
  end
end
