# frozen_string_literal: true

require_relative "tts_template"

module CustomerOGM
	def self.for(url, tel, fetch_vcard)
		return Media.new(url) if url

		TTS.for(tel, fetch_vcard)
	end

	class Media
		def initialize(url)
			@url = url
		end

		def to_render
			[:voicemail_ogm_media, { locals: { url: @url } }]
		end

		def as_json(*)
			{
				media_url: @url
			}
		end

		def to_json(*args)
			as_json.to_json(*args)
		end
	end

	class TTS
		def self.for(tel, fetch_vcard)
			fetch_vcard.call.then { |vcard|
				new(tel, vcard.first.payload_node)
			}.catch { new(tel, Nokogiri::XML::Document.new) }
		end

		def initialize(tel, vcard)
			@tel = tel
			@vcard = vcard
		end

		def [](k)
			value = @vcard.find_first(
				"./ns:#{k.downcase}/ns:text",
				ns: "urn:ietf:params:xml:ns:vcard-4.0"
			)
			return if !value || value.content.empty?

			value.content
		end

		def fn
			self["FN"] || self["NICKNAME"] || formatted_tel
		end

		def formatted_tel
			@tel.sub(/\A\+?1(\d{3})(\d{3})(\d+)/, "\\1.\\2.\\3").gsub(/(?=\d)/, " ")
		end

		def to_render
			[:voicemail_ogm_tts, { locals: { fn: fn } }]
		end

		def as_json(*)
			{
				tts: TTSTemplate.new(to_render.first).tts(self)
			}
		end

		def to_json(*args)
			as_json.to_json(*args)
		end
	end
end
