import subprocess
import speech_recognition as sr
import os
from functions.loging import loging


class Converter:
    """
    Этот класс выполняет главную функцию, конвертирует голос в текст
    """
    def __init__(self, path_to_file: str, message, language: str = "ru-RU"):
        self.language = language
        self.path_to_file = path_to_file
        self.service = None
        self.message = message

    def audio_to_text(self) -> str:
        """
        Основная функция

        :return: str - текст + служебная информация
        """
        f = -1.0
        try:
            try:
                import mutagen
                f = mutagen.File(self.path_to_file)   # получение данных mutagen
                f = float(f.info.length)
                if f >= 30.0:   # если длинна больше 30 секунд
                    self.service = "google"   # устанавливаю сервис google
                    return self.google(f)   # запуск функции google
                else:
                    self.service = "yandex"   # устанавливаем сервис yandex
                    return self.yandex(f)   # запуск функции yandex
            except Exception as e:   # если какая-то проблема
                print(e)
                return self.google(f)   # запуск функции google
        except sr.RequestError:  # обработка ошибки размера файлов
            return "Толи файл слишком большой, толи с ботом что-то случилось"  # возвращение ошибки

    def google(self, f) -> str:
        """
        Функция работающая с stt google

        :return: str - текст + служебная информация
        """
        subprocess.run(['ffmpeg', '-v', 'quiet', '-i', self.path_to_file, self.path_to_file.replace(".ogg", ".wav")])
        # перевод ogg в wav
        try:
            os.remove(self.path_to_file)  # удаляю файл
            wav_file = self.path_to_file.replace(".ogg", ".wav")  # замена в ссылке на файл ogg в wav
            r = sr.Recognizer()  # создаю объект google stt
            with sr.AudioFile(wav_file) as source:  # получаю байты из файла
                audio = r.record(source)  # получаю файл в нужном google stt формате байт
                r.adjust_for_ambient_noise(source)  # мини очистка шума
            try:
                response = "google\n\n" + r.recognize_google(audio, language=self.language)  # получение текста
                loging(self.message, "google", wav_file, response, f)  # записываю логи
                os.remove(wav_file)  # удаляю лишние файлы
                return response  # возвращаю текст
            except sr.UnknownValueError:  # ошибка распознавания текста
                return "google\n\n Слова не распознаны, вы что вообще мне впихнуть пытаетесь"  # возвращаю ошибочное
                # сообщение
        except FileNotFoundError:  # ошибка файла(из-за веса telegram не пускает)
            return "Толи файл слишком большой, толи с ботом что-то случилось"  # возвращение ошибки

    def yandex(self, f) -> str:
        """
        Функция работающая с stt yandex

        :return: str - текст + служебная информация
        """
        from speechkit import ShortAudioRecognition, Session  # импортирую сесию и объект для stt
        reg = ShortAudioRecognition(Session.from_api_key("AQVN3xNJamAFP4_FS6Gis0Uud0vONFk24umBSXvh"))  # получаю
        # объект для расшифровки
        response = "yandex\n\n" + reg.recognize(open(str(self.path_to_file), str('rb')).read())  # получаю весь текст
        loging(self.message, "yandex", self.path_to_file, response, f)  # записываю логи
        os.remove(self.path_to_file)  # удаляю лишние файлы
        return response  # возвращаю ответ
