1# frozen_string_literal: true
2
3module CustomerOGM
4 def self.for(url, tel, fetch_vcard)
5 return Media.new(url) if url
6
7 TTS.for(tel, fetch_vcard)
8 end
9
10 class Media
11 def initialize(url)
12 @url = url
13 end
14
15 def to_render
16 [:voicemail_ogm_media, { locals: { url: @url } }]
17 end
18 end
19
20 class TTS
21 def self.for(tel, fetch_vcard)
22 fetch_vcard.call.then { |vcard|
23 new(tel, vcard.first.payload_node)
24 }.catch { new(tel, Nokogiri::XML::Document.new) }
25 end
26
27 def initialize(tel, vcard)
28 @tel = tel
29 @vcard = vcard
30 end
31
32 def [](k)
33 value = @vcard.find_first(
34 "./ns:#{k.downcase}/ns:text",
35 ns: "urn:ietf:params:xml:ns:vcard-4.0"
36 )
37 return if !value || value.content.empty?
38
39 value.content
40 end
41
42 def fn
43 self["FN"] || self["NICKNAME"] || formatted_tel
44 end
45
46 def formatted_tel
47 @tel.sub(/\A\+?1?(\d{3})(\d{3})/, "(\\1) \\2-")
48 end
49
50 def to_render
51 [:voicemail_ogm_tts, { locals: { fn: fn } }]
52 end
53 end
54end