# frozen_string_literal: true

# Mistral API service
class Mistral
  TRANSCRIPTION_API_URL = "https://api.mistral.ai/v1/audio/transcriptions"
  TRANSCRIPTION_MODEL = "voxtral-mini-latest"

  def self.transcribe(respondent, system_task)
    proper_nouns_list = Array(respondent.proper_nouns).map(&:to_s).map(&:strip).reject(&:blank?)

    request_body = {
      file_url: respondent.audio_file.url(:original, timestamp: false),
      model: TRANSCRIPTION_MODEL,
      diarize: "true",
      timestamp_granularities: "segment",
      context_bias: proper_nouns_list.join(",").presence
    }.compact

    response = HTTP.headers(
      "Accept" => "application/json",
      "x-api-key" => Rails.application.credentials.mistral[:key]
    ).post(
      TRANSCRIPTION_API_URL,
      form: request_body
    )

    Rails.logger.debug("Voxtral response - #{response}")

    raise StandardError, "Mistral API Error (#{response.status.code}): #{response.body}" unless response.status.success?

    parsed_response = JSON.parse(response.body.to_s)

    transcript = parsed_response.fetch("segments", []).map do |segment|
      {
        "end" => segment["end"],
        "text" => segment["text"].to_s.strip,
        "start" => segment["start"],
        "words" => [],
        "speaker" => segment["speaker_id"] || "Unknown Speaker"
      }
    end

    WhisperTranscript.create!(respondent_id: respondent.id, verbose_json: transcript)

    system_task.update!(running: false, status: "complete")
    system_task.set_progress!(progress: 100, org_id: system_task.user.organization_id, metadata: { respondent_id: respondent.id })
  end
end
