# frozen_string_literal: true

require "regexp-examples"

class Rantly
	module Data
		module Extensions
			REGEXP_EXAMPLES_OPTS = {
				max_group_results: 10,
				max_repeater_variance: 10
			}.freeze

			# @see https://github.com/mnestorov/regex-patterns
			# @return [String]
			FRENCH_PHONE = /\+33[1-9]\d{8}/.freeze
			# @return [String]
			GERMAN_PHONE = /\+49[1-9]\d{3,12}/.freeze
			# @return [String]
			UK_PHONE = /\+44[1-9]\d{9,10}/.freeze
			# @return [String]
			SPANISH_PHONE = /\+34[6-9]\d{8}/.freeze
			# @return [String]
			ITALIAN_PHONE = /\+39[0-9]{9,10}/.freeze

			# @return [String]
			def french_phone
				FRENCH_PHONE.random_example(**REGEXP_EXAMPLES_OPTS)
			end

			# @return [String]
			def german_phone
				GERMAN_PHONE.random_example(**REGEXP_EXAMPLES_OPTS)
			end

			# @return [String]
			def uk_phone
				UK_PHONE.random_example(**REGEXP_EXAMPLES_OPTS)
			end

			# @return [String]
			def spanish_phone
				SPANISH_PHONE.random_example(**REGEXP_EXAMPLES_OPTS)
			end

			# @return [String]
			def italian_phone
				ITALIAN_PHONE.random_example(**REGEXP_EXAMPLES_OPTS)
			end

			# @return [String]
			def non_nanp_phone
				send(
					choose(
						:french_phone, :german_phone, :uk_phone,
						:spanish_phone, :italian_phone
					)
				)
			end

			# @note https://stackoverflow.com/questions/6478875/regular-expression-matching-e-164-formatted-phone-numbers
			# @return [String]
			def nanpa_phone
				"+1" +
					sized(1) { string(/[2-9]/) } +
					sized(2) { string(/[0-9]/) } +
					sized(1) { string(/[2-9]/) } +
					sized(6) { string(/[0-9]/) }
			end

			# @note https://stackoverflow.com/questions/4894198/how-to-generate-a-random-date-in-ruby
			# @return [String]
			def iso8601(from = 0.0, to = Time.now)
				value { Time.at(from + float * (to.to_f - from.to_f)).iso8601 }
			end

			# @return [String]
			def bare_jid
				local = sized(range(3, 12)) { string(:alnum) }
				domain = sized(range(3, 8)) { string(:lower) }
				"#{local}@#{domain}.example.com"
			end

			# @return [String]
			def bw_message_id
				sized(range(6, 19)) { string(:alnum) }
			end

			# @return [String]
			def shortcode
				range(10000, 999999).to_s
			end

			# @return [Array<String>]
			HTTP_ESCAPABLE = " &=?/+@#".chars.freeze

			# @return [String]
			def maybe_http_escapable_string
				base = sized(range(3, 8)) { string(:alnum) }
				choose(
					base,
					base + choose(*HTTP_ESCAPABLE) +
						sized(range(1, 5)) { string(:alnum) }
				)
			end

			# @return [String]
			def message_body
				words = array(range(1, 6)) { sized(range(3, 10)) { string(:alnum) } }
				guard(words.none? { |w| BADWORD_LIST.include?(w.downcase) })
				words.join(" ")
			end

			# @return [String]
			def media_url
				user_id = sized(range(3, 10)) { string(:alnum) }
				name = sized(range(3, 12)) { string(:alnum) }
				ext = choose(".jpg", ".png", ".gif", ".mp4", ".pdf", ".smil", ".txt", ".xml")
				"https://messaging.bandwidth.com/api/v2/users/#{user_id}/media/#{name}#{ext}"
			end
		end
	end

	include Data::Extensions
end
