1# frozen_string_literal: true
2
3require_relative "bwmsgsv2_repo"
4require_relative "customer_repo"
5require_relative "proxied_jid"
6
7class CustomerInfoForm
8 def initialize(customer_repo=CustomerRepo.new(sgx_repo: Bwmsgsv2Repo.new))
9 @customer_repo = customer_repo
10 end
11
12 def picker_form
13 form = Blather::Stanza::X.new(:form)
14 form.title = "Pick Customer"
15 form.instructions = "Tell us something about the customer and we'll try " \
16 "to get more information for you"
17
18 form.fields = {
19 var: "q", type: "text-single",
20 label: "Something about the customer",
21 description: "Supported things include: customer ID, JID, phone number"
22 }
23
24 form
25 end
26
27 def find_customer(response)
28 parse_something(response.form.field("q").value)
29 end
30
31 class NoCustomer
32 def form
33 FormTemplate.render("no_customer_info")
34 end
35
36 def admin_info
37 self
38 end
39 end
40
41 def parse_something(value)
42 parser = Parser.new(@customer_repo)
43
44 EMPromise.all([
45 parser.as_customer_id(value),
46 parser.as_jid(value),
47 parser.as_phone(value),
48 EMPromise.resolve(NoCustomer.new)
49 ]).then { |approaches| approaches.compact.first }
50 end
51
52 class Parser
53 def initialize(customer_repo)
54 @customer_repo = customer_repo
55 end
56
57 def as_customer_id(value)
58 @customer_repo.find(value).catch { nil }
59 end
60
61 def as_cheo(value)
62 ProxiedJID.proxy(Blather::JID.new(value))
63 end
64
65 def as_jid(value)
66 EMPromise.all([
67 @customer_repo.find_by_jid(value).catch { nil },
68 @customer_repo.find_by_jid(as_cheo(value)).catch { nil }
69 ]).then { |approaches| approaches.compact.first }
70 end
71
72 def as_phone(value)
73 unless value.gsub(/[^0-9]/, "") =~ /^\+?1?(\d{10})$/
74 return EMPromise.resolve(nil)
75 end
76
77 @customer_repo.find_by_tel("+1#{$1}").catch { nil }
78 end
79 end
80end