# frozen_string_literal: true

require "em-http"
require "em_promise"
require "json"

class RevAi
	def initialize(token: CONFIG[:rev_ai_token])
		@token = token
	end

	def stt(language, media_url, callback_url, **kwargs)
		req(
			:post,
			"https://api.rev.ai/speechtotext/v1/jobs",
			metadata: { media_url: media_url }.merge(kwargs).to_json,
			source_config: { url: media_url },
			notification_config: { url: callback_url },
			remove_disfluencies: language == "en",
			skip_diarization: true,
			language: language
		)
	end

	def stt_result(job)
		job = job["job"]
		req(
			:get,
			"https://api.rev.ai/speechtotext/v1/jobs/#{job['id']}/transcript",
			accept: "text/plain"
		).then do |res|
			text = res.response.split("    ", 3)[2].strip
			job.merge("text" => text, "metadata" => JSON.parse(job["metadata"]))
		end
	end

	def language_id(media_url, callback_url, **kwargs)
		req(
			:post,
			"https://api.rev.ai/languageid/v1/jobs",
			metadata: { media_url: media_url }.merge(kwargs).to_json,
			source_config: { url: media_url },
			notification_config: { url: callback_url }
		)
	end

	def language_id_result(job)
		job = job["job"]
		req(
			:get,
			"https://api.rev.ai/languageid/v1/jobs/#{job['id']}/result"
		).then do |res|
			json = JSON.parse(res.response)
			job.merge(json).merge("metadata" => JSON.parse(job["metadata"]))
		end
	end

	def req(m, url, accept: nil, **kwargs)
		EM::HttpRequest.new(
			url, tls: { verify_peer: true }
		).public_send(
			"a#{m}",
			head: {
				"Authorization" => "Bearer #{@token}",
				"Content-Type" => "application/json",
				"Accept" => accept
			}, body: kwargs.to_json
		)
	end
end
