# frozen_string_literal: true

require "lazy_object"

require_relative "customer_fwd"
require_relative "ibr_repo"
require_relative "trivial_backend_sgx_repo"

class Bwmsgsv2Repo
	VOICEMAIL_TRANSCRIPTION_DISABLED = 0

	def initialize(
		jid: CONFIG[:sgx],
		redis: LazyObject.new { REDIS },
		ibr_repo: IBRRepo.new,
		**kwargs
	)
		@jid = jid
		@redis = redis
		@ibr_repo = ibr_repo
		@trivial_repo = TrivialBackendSgxRepo.new(jid: jid, redis: redis, **kwargs)
	end

	def get(customer_id, tel: nil)
		@trivial_repo.get(customer_id, tel: tel)
			.then { |sgx| EMPromise.all([fetch_raw(sgx), sgx]) }
			.then do |((((ogm_url, fwd_time, fwd), flags), reg), sgx)|
				sgx.with(
					ogm_url: ogm_url,
					fwd: CustomerFwd.for(uri: fwd, timeout: fwd_time),
					transcription_enabled: !flags[VOICEMAIL_TRANSCRIPTION_DISABLED],
					registered?: reg
				)
			end
	end

	def put_transcription_enabled(customer_id, enabled)
		@trivial_repo.get(customer_id).then do |sgx|
			REDIS.setbit(
				"catapult_settings_flags-#{sgx.from_jid}",
				Bwmsgsv2Repo::VOICEMAIL_TRANSCRIPTION_DISABLED,
				enabled ? 0 : 1
			)
		end
	end

	def put_fwd(customer_id, tel, customer_fwd)
		@trivial_repo.get(customer_id).then do |sgx|
			EMPromise.all([
				set_or_delete("catapult_fwd-#{tel}", customer_fwd.uri),
				set_or_delete(
					"catapult_fwd_timeout-#{sgx.from_jid}",
					customer_fwd.timeout.to_i
				)
			])
		end
	end

protected

	def set_or_delete(k, v)
		if v.nil?
			REDIS.del(k)
		else
			REDIS.set(k, v)
		end
	end

	def fetch_raw(sgx)
		registration(sgx).then do |r|
			EMPromise.all([from_redis(sgx.from_jid, r ? r.phone : nil), r])
		end
	end

	def registration(sgx)
		EMPromise.resolve(sgx.registered?)
	rescue NotLoaded::NotLoadedError
		@ibr_repo.registered?(sgx.jid, from: sgx.from_jid)
	end

	def from_redis(from_jid, tel)
		EMPromise.all([
			@redis.mget(*[
				"catapult_ogm_url-#{from_jid}",
				"catapult_fwd_timeout-#{from_jid}",
				("catapult_fwd-#{tel}" if tel)
			].compact),
			unpack_flags(from_jid)
		])
	end

	def unpack_flags(from_jid)
		@redis.bitfield(
			"catapult_settings_flags-#{from_jid}",
			"GET", "u1", VOICEMAIL_TRANSCRIPTION_DISABLED
		).then { |arr| arr.map { |x| x.to_i == 1 } }
	end
end
