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