1# frozen_string_literal: true
2
3require_relative "tts_template"
4
5module CustomerOGM
6 def self.for(url, tel, fetch_vcard)
7 return Media.new(url) if url
8
9 TTS.for(tel, fetch_vcard)
10 end
11
12 class Media
13 def initialize(url)
14 @url = url
15 end
16
17 def to_render
18 [:voicemail_ogm_media, { locals: { url: @url } }]
19 end
20
21 def as_json(*)
22 {
23 media_url: @url
24 }
25 end
26
27 def to_json(*args)
28 as_json.to_json(*args)
29 end
30 end
31
32 class TTS
33 def self.for(tel, fetch_vcard)
34 fetch_vcard.call.then { |vcard|
35 new(tel, vcard.first.payload_node)
36 }.catch { new(tel, Nokogiri::XML::Document.new) }
37 end
38
39 def initialize(tel, vcard)
40 @tel = tel
41 @vcard = vcard
42 end
43
44 def [](k)
45 value = @vcard.find_first(
46 "./ns:#{k.downcase}/ns:text",
47 ns: "urn:ietf:params:xml:ns:vcard-4.0"
48 )
49 return if !value || value.content.empty?
50
51 value.content
52 end
53
54 def fn
55 self["FN"] || self["NICKNAME"] || formatted_tel
56 end
57
58 def formatted_tel
59 @tel.sub(/\A\+?1(\d{3})(\d{3})(\d+)/, "\\1.\\2.\\3").gsub(/(?=\d)/, " ")
60 end
61
62 def to_render
63 [:voicemail_ogm_tts, { locals: { fn: fn } }]
64 end
65
66 def as_json(*)
67 {
68 tts: TTSTemplate.new(to_render.first).tts(self)
69 }
70 end
71
72 def to_json(*args)
73 as_json.to_json(*args)
74 end
75 end
76end