# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/

require 'rails_helper'

RSpec.describe Service::GeoLocation do
  describe '#geocode' do
    subject(:geocode) { described_class.geocode(address) }

    context 'when checking simple results' do
      let(:address)   { 'Marienstrasse 13, 10117 Berlin' }
      let(:latitude)  { 52.5220514 }
      let(:longitude) { 13.3832091 }
      let(:result)    { [latitude, longitude] }

      before do
        allow(Service::GeoLocation::Osm).to receive(:geocode).and_return(result)
      end

      it { is_expected.to eq(result) }

      context 'when address field in user preferences is filled' do
        let(:user) { create(:user, address: address) }

        it 'stores correct values for latitude + longitude' do
          expect(user.preferences).to include({ 'lat' => latitude, 'lng' => longitude })
        end
      end

      context 'when street, city and zip fields in user preferences are filled' do
        let(:address)       { 'Marienstrasse 13, 10117, Berlin' }
        let(:address_parts) { address.split(%r{\.?\s+}, 4) }
        let(:street)        { "#{address_parts.first} #{address_parts[1].chop}" }
        let(:zip)           { address_parts[2].chop }
        let(:city)          { address_parts.last }

        let(:user) { create(:user, street: street, zip: zip, city: city) }

        it 'stores correct values for latitude + longitude' do
          expect(user.preferences).to include({ 'lat' => latitude, 'lng' => longitude })
        end
      end
    end
  end

  describe '#reverse_geocode' do
    subject(:reverse_geocode) { described_class.reverse_geocode(latitude, longitude) }

    context 'when checking simple results' do
      let(:latitude)        { 52.5220514 }
      let(:longitude)       { 13.3832091 }
      let(:result)          { '13, Marienstraße, Dorotheenstadt, Mitte, Berlin, 10117, Deutschland' }

      before do
        allow(Service::GeoLocation::Osm).to receive(:reverse_geocode).and_return(result)
      end

      it { is_expected.to eq(result) }
    end
  end
end