# frozen_string_literal: true
require_relative "bwmsgsv2_repo"
require_relative "customer_repo"
require_relative "proxied_jid"
require_relative "legacy_customer"
class CustomerInfoForm
def initialize(customer_repo=CustomerRepo.new(sgx_repo: Bwmsgsv2Repo.new))
@customer_repo = customer_repo
end
def picker_form
form = Blather::Stanza::X.new(:form)
form.title = "Pick Customer"
form.instructions = "Tell us something about the customer and we'll try " \
"to get more information for you"
form.fields = {
var: "q", type: "text-single",
label: "Something about the customer",
description: "Supported things include: customer ID, JID, phone number"
}
form
end
def find_customer(response)
parse_something(response.form.field("q").value)
end
class NoCustomer
class AdminInfo
def fields
[{ var: "Account Status", value: "Not Found" }]
end
end
def admin_info
AdminInfo.new
end
end
def parse_something(value)
parser = Parser.new(@customer_repo)
EMPromise.all([
parser.as_customer_id(value),
parser.as_jid(value),
parser.as_phone(value),
EMPromise.resolve(NoCustomer.new)
]).then { |approaches| approaches.compact.first }
end
class Parser
def initialize(customer_repo)
@customer_repo = customer_repo
end
def as_customer_id(value)
@customer_repo.find(value).catch { nil }
end
def as_cheo(value)
ProxiedJID.proxy(Blather::JID.new(value))
end
def as_jid(value)
EMPromise.all([
@customer_repo.find_by_jid(value).catch { nil },
@customer_repo.find_by_jid(as_cheo(value)).catch { nil }
]).then { |approaches| approaches.compact.first }
end
def as_phone(value)
unless value.gsub(/[^0-9]/, "") =~ /^\+?1?(\d{10})$/
return EMPromise.resolve(nil)
end
@customer_repo.find_by_tel("+1#{$1}").catch { nil }
end
end
end