# frozen_string_literal: true # TODO find way to optimize dataset loading require_relative "costa_rica_address_utils/version" require_relative "costa_rica_address_utils/dataset" # Constant LOCATIONS_DATASET with a big hash of all Costa Rica combinations for Province, Cantons, Districts require_relative "costa_rica_address_utils/errors" module CostaRicaAddressUtils VAlID_PROVIDERS = [:shopify, :brightpearl] class Error < StandardError; end # Your code goes here... # Fetch the address data from provided input, return options for subaddresses on each level and zip code if full address is valid def self.fetch_address_data(province:, canton: nil, district: nil) raise InvalidData, "Province is required" if province.nil? || province.empty? province_data = LOCATIONS_DATASET[province] canton_data = !!province_data ? province_data["cantons"][canton] : nil district_data = !!canton_data ? canton_data["districts"][district] : nil canton_options = !!province_data ? province_data["cantons"].keys : [] # Cantons options, only if province is valid district_options = !!canton_data ? canton_data["districts"].keys : [] # Districts options, only if canton is valid zip = (!!district_data && district_data["zip_code"]) || nil # Zip code, only if full address is valid return { zip: zip, # Names options province_options: LOCATIONS_DATASET.keys, canton_options: canton_options, district_options: district_options, } end def self.address_valid?(province:, canton:, district:) is_valid = true begin data = fetch_address_data(province: province, canton: canton, district: district) is_valid = !!data[:zip] # Is valid if matched to a zip code rescue InvalidData => e is_valid = false end return is_valid end # Build a Costa Rica address from an address of an external provider (Shopify, Brightpearl, etc) # https://shopify.dev/api/admin-graphql/2022-10/objects/mailingaddress # https://api-docs.brightpearl.com/contact/postal-address/get.html def self.build_address_from_provider(address:, provider:) case provider when :shopify return { name: address.name, # Customer name address1: address.address1, province: address.province, canton: address.city, district: address.address2, zip: address.zip, national_id: address.company, phone: address.phone, } when :brightpearl return { name: address["addressFullName"], # Customer name address1: address["addressLine1"], province: address["addressLine4"], canton: address["addressLine3"], district: address["addressLine2"], zip: address["postalCode"], national_id: address["companyName"], phone: address["telephone"], } else raise InvalidData("Invalid provider, valid providers are: #{VAlID_PROVIDERS}") end end end # module CostaRicaAddressUtils