# frozen_string_literal: true

require "ruby-bandwidth-iris"

class BandwidthTnRepo
	STASH_QUERY = <<~SQL
		INSERT INTO tel_inventory (
			tel,
			region,
			locality,
			bandwidth_account_id,
			available_after
		) VALUES (
			$1,
			$2,
			$3,
			$4,
			LOCALTIMESTAMP + '1 MONTH'
		)
	SQL

	def initialize
		@move_client =
			BandwidthIris::Client.new(
				account_id: CONFIG[:keep_area_codes_in][:account],
				username: CONFIG[:creds][:username],
				password: CONFIG[:creds][:password]
			)
	end

	def find(tel)
		BandwidthIris::Tn.new(telephone_number: tel).get_details
	rescue StandardError
		{}
	end

	def put_lidb_name(tel, lidb_name)
		BandwidthIris::Lidb.create(
			lidb_tn_groups: { lidb_tn_group: {
				telephone_numbers: { telephone_number: tel.sub(/\A\+1/, "") },
				subscriber_information: lidb_name,
				use_type: "RESIDENTIAL", visibility: "PUBLIC"
			} }
		)
	rescue BandwidthIris::Errors::GenericError
		raise "Could not set CNAM, please contact support"
	end

	def stash_for_later(tel, btn)
		details = btn.get_rate_center
		region = details[:state]
		raise "No city in: #{details.inspect}" unless details[:city]

		locality = details[:city]
		params = [tel, region, locality, CONFIG[:creds][:account]]
		DB.exec(STASH_QUERY, params)
	end

	def disconnect(tel, order_name)
		tn = tel.sub(/\A\+1/, "")
		btn = BandwidthIris::Tn.new({ telephone_number: tn }, @move_client)
		if CONFIG[:keep_area_codes].find { |area| tn.start_with?(area) }
			stash_for_later(tel, btn)
		else
			BandwidthIris::Disconnect.create(order_name, tn)
		end
	end

	def move(tel, order_name, source_account_id)
		tn = tel.sub(/\A\+1/, "")
		BandwidthIris::Tn.new({ telephone_number: tn }, @move_client).move(
			customer_order_id: order_name,
			source_account_id: source_account_id,
			site_id: CONFIG[:bandwidth_site],
			sip_peer_id: CONFIG[:bandwidth_peer]
		)
	end
end
