module Fields::AddressFieldHelper

def address_city_line_formatted(address)

def address_city_line_formatted(address)
  country_iso2 = address.country&.iso2 # can be nil or empty
  city = address.city
  region = address.region&.name
  postal_code = address.postal_code
  # adapted from https://github.com/cainlevy/snail/blob/master/lib/snail.rb
  # using iso2 property here because it's a port of what's used in snail gem
  # will be cleaned up below if parts missing
  formatted = case country_iso2
  when "CN", "IN"
    "#{city}, #{region}  #{postal_code}"
  when "BR"
    "#{postal_code} #{city}#{"-" unless city.nil? || city.empty? || region.nil? || region.empty?}#{region}"
  when "MX", "SK"
    "#{postal_code} #{city}, #{region}"
  when "IT"
    "#{postal_code} #{city} #{region}"
  when "BY"
    "#{postal_code} #{city}#{"-" unless city.nil? || city.empty? || region.nil? || region.empty?}#{region}"
  when "US", "CA", "AU", nil, ""
    "#{city} #{region}  #{postal_code}"
  when "IL", "DK", "FI", "FR", "DE", "GR", "NO", "ES", "SE", "TR", "CY", "PT", "MK", "BA"
    "#{postal_code} #{city}"
  when "KW", "SY", "OM", "EE", "LU", "BE", "IS", "CH", "AT", "MD", "ME", "RS", "BG", "GE", "PL", "AM", "HR", "RO", "AZ"
    "#{postal_code} #{city}"
  when "NL"
    "#{postal_code}  #{city}"
  when "IE"
    "#{city}, #{region}\n#{postal_code}"
  when "GB", "RU", "UA", "JO", "LB", "IR", "SA", "NZ"
    "#{city}  #{postal_code}" # Locally these may be on separate lines. The USPS prefers the city line above the country line, though.
  when "EC"
    "#{postal_code} #{city}"
  when "HK", "IQ", "YE", "QA", "AL"
    city.to_s
  when "AE"
    "#{postal_code}\n#{city}"
  when "JP"
    "#{city}, #{region}\n#{postal_code}"
  when "EG", "ZA", "IM", "KZ", "HU"
    "#{city}\n#{postal_code}"
  when "LV"
    "#{city}, LV-#{postal_code}".gsub(/LV-\s*$/, "") # undo if no postal code
  when "LT"
    "LT-#{postal_code} #{city}".gsub(/^LT-\s*/, "") # undo if no postal code
  when "SI"
    "SI-#{postal_code} #{city}".gsub(/^SI-\s*/, "") # undo if no postal code
  when "CZ"
    "#{postal_code} #{region}\n#{city}"
  else
    "#{city} #{region}  #{postal_code}"
  end
  # clean up separators when missing pieces
  formatted.strip      # remove extra spaces and newlines before and after
    .gsub(/^,\s*/, "") # remove extra comma from start
    .gsub(/\s*,$/, "") # remove extra comma from end
end

def address_formatted(address, one_line: false)

def address_formatted(address, one_line: false)
  return "" if address.all_blank?
  formatted = [
    address.address_one,
    address.address_two,
    address_city_line_formatted(address),
    address.country&.name&.upcase
  ].reject(&:blank?)
  if one_line
    formatted.join(", ") # simplistic
  else
    simple_format(formatted.join("\n"))
  end
end

def admin_division_label_for(address_form)

def admin_division_label_for(address_form)
  # using country_id because it's fastest, even if this case statement is hard to read
  admin_divisions_key = case address_form.object.country_id
  when 31, 142, 239, 101
    :states
  when 39
    :provinces_territories
  when 109
    :prefectures
  when 107, 45, 116, 182, 207, 219, 230, 156, 204
    :provinces
  when 14, 233
    :states_territories
  when 59
    :regions
  when 82, 15
    :federal_states
  when 75
    :departments
  when 105
    :counties
  when 214
    :cantons
  else
    :default
  end
  path = [:addresses, :fields, :admin_divisions, admin_divisions_key]
  t(path.compact.join("."))
end

def populate_country_options

def populate_country_options
  ([Addresses::Country.find_by(name: "United States"), Addresses::Country.find_by(name: "Canada")] + Addresses::Country.all).map { |country| [country.name, country.id] }.uniq
end

def populate_region_options(address_form)

def populate_region_options(address_form)
  return [] if address_form.object.country_id.nil?
  Addresses::Region.where(country_id: address_form.object.country_id).map { |region| [region.name, region.id] }
end

def postal_code_label_for(address_form)

def postal_code_label_for(address_form)
  key = if address_form.object.country_id == 233
    :zip_code
  else
    :postal_code
  end
  path = [:addresses, :fields, key, :label]
  t(path.compact.join("."))
end