defmodule Microwaveprop.Radio.ContactTest do
  use Microwaveprop.DataCase, async: true

  alias Microwaveprop.Radio.Contact

  @valid_attrs %{
    station1: "W1AW",
    station2: "K3LR",
    qso_timestamp: ~U[2026-03-28 12:00:00Z],
    grid1: "FN31pr",
    grid2: "EN91jm",
    pos1: %{lat: 41.714, lon: -72.727},
    pos2: %{lat: 41.049, lon: -80.166},
    mode: "SSB",
    band: Decimal.new("144.2"),
    distance_km: Decimal.new("623.4")
  }

  describe "changeset/2" do
    test "valid attributes" do
      changeset = Contact.changeset(%Contact{}, @valid_attrs)
      assert changeset.valid?
    end

    test "requires station1, station2, qso_timestamp, and band (mode is optional)" do
      changeset = Contact.changeset(%Contact{}, %{})

      errors = errors_on(changeset)
      assert errors.station1 == ["can't be blank"]
      assert errors.station2 == ["can't be blank"]
      assert errors.qso_timestamp == ["can't be blank"]
      assert errors.band == ["can't be blank"]
      refute Map.has_key?(errors, :mode)
    end

    test "persists to the database" do
      changeset = Contact.changeset(%Contact{}, @valid_attrs)
      assert {:ok, contact} = Repo.insert(changeset)
      assert contact.station1 == "W1AW"
      assert contact.station2 == "K3LR"
      assert contact.mode == "SSB"
      assert Decimal.equal?(contact.band, Decimal.new("144.2"))
      assert Decimal.equal?(contact.distance_km, Decimal.new("623.4"))
    end

    test "accepts optional height1_ft and height2_ft" do
      attrs = Map.merge(@valid_attrs, %{height1_ft: 25, height2_ft: 60})
      changeset = Contact.changeset(%Contact{}, attrs)
      assert changeset.valid?
      assert {:ok, contact} = Repo.insert(changeset)
      assert contact.height1_ft == 25
      assert contact.height2_ft == 60
    end
  end

  describe "submission_changeset/2" do
    @submission_attrs %{
      "station1" => "W1AW",
      "station2" => "K3LR",
      "qso_timestamp" => "2026-03-28T12:00:00Z",
      "grid1" => "FN31pr",
      "grid2" => "EN91jm",
      "mode" => "SSB",
      "band" => Decimal.new("144"),
      "submitter_email" => "test@example.com"
    }

    test "accepts height1_ft and height2_ft" do
      attrs = Map.merge(@submission_attrs, %{"height1_ft" => 10, "height2_ft" => 50})
      changeset = Contact.submission_changeset(%Contact{}, attrs)
      assert changeset.valid?, inspect(errors_on(changeset))
      assert Ecto.Changeset.get_field(changeset, :height1_ft) == 10
      assert Ecto.Changeset.get_field(changeset, :height2_ft) == 50
    end
  end
end
