defmodule Microwaveprop.Workers.StationElevationWorker do
  @moduledoc """
  Oban worker that enriches a `FixedStation` row with its SRTM
  elevation. Enqueued from `Microwaveprop.Rover.create_station/2`
  whenever the user-supplied attrs leave `elevation_m` nil.

  A missing tile or a void value is non-fatal — the row simply stays
  with `elevation_m = nil`. The worker also no-ops if the station has
  been deleted between enqueue and execution.
  """
  use Oban.Worker, queue: :terrain, max_attempts: 3

  alias Microwaveprop.Repo
  alias Microwaveprop.Rover.FixedStation
  alias Microwaveprop.Terrain.Srtm

  @impl Oban.Worker
  def perform(%Oban.Job{args: %{"id" => id}}) do
    case Repo.get(FixedStation, id) do
      nil ->
        :ok

      station ->
        update_elevation(station)
    end
  end

  defp update_elevation(station) do
    tiles_dir = Application.get_env(:microwaveprop, :srtm_tiles_dir, "/data/srtm")

    case Srtm.lookup(station.lat, station.lon, tiles_dir) do
      {:ok, elev} ->
        station
        |> Ecto.Changeset.change(elevation_m: elev)
        |> Repo.update()

        :ok

      {:error, _} ->
        :ok
    end
  end
end
