from os import getenv
from pathlib import Path

import sox
from mutagen import MutagenError
from mutagen.mp3 import MP3, HeaderNotFoundError
from rich.progress import track

from utils.console import print_step, print_substep
from utils.voice import sanitize_text
from video_creation.TTSwrapper import TTTTSWrapper

VIDEO_LENGTH: int = 40  # secs


def save_text_to_mp3(reddit_obj):
    """Saves Text to MP3 files.

    Args:
        reddit_obj : The reddit object you received from the reddit API in the askreddit.py file.
    """
    print_step("Saving Text to MP3 files 🎶")
    length = 0

    # Create a folder for the mp3 files.
    Path("assets/temp/mp3").mkdir(parents=True, exist_ok=True)

    ttttsw = TTTTSWrapper()  # tiktok text to speech wrapper
    ttttsw.tts(
        sanitize_text(reddit_obj["thread_title"]),
        filename=f"assets/temp/mp3/title.mp3",
        random_speaker=False,
    )
    try:
        length += MP3(f"assets/temp/mp3/title.mp3").info.length
    except HeaderNotFoundError:  # note to self AudioFileClip
        length += sox.file_info.duration(f"assets/temp/mp3/title.mp3")
    if getenv("STORYMODE").casefold() == "true":
        ttttsw.tts(
            sanitize_text(reddit_obj["thread_content"]),
            filename=f"assets/temp/mp3/story_content.mp3",
            random_speaker=False,
        )
        #'story_content'
    com = 0
    for comment in track((reddit_obj["comments"]), "Saving..."):
        # ! Stop creating mp3 files if the length is greater than VIDEO_LENGTH seconds. This can be longer, but this is just a good_voices starting point
        if length > VIDEO_LENGTH:
            break

        ttttsw.tts(
            sanitize_text(comment["comment_body"]),
            filename=f"assets/temp/mp3/{com}.mp3",
            random_speaker=False,
        )
        try:
            length += MP3(f"assets/temp/mp3/{com}.mp3").info.length
            com += 1
        except (HeaderNotFoundError, MutagenError, Exception):
            try:
                length += sox.file_info.duration(f"assets/temp/mp3/{com}.mp3")
                com += 1
            except (OSError, IOError):
                print(
                    "would have removed"
                    f"assets/temp/mp3/{com}.mp3"
                    f"assets/temp/png/comment_{com}.png"
                )
                # remove(f"assets/temp/mp3/{com}.mp3")
                # remove(f"assets/temp/png/comment_{com}.png")# todo might cause odd un-syncing

    print_substep("Saved Text to MP3 files Successfully.", style="bold green")
    # ! Return the index, so we know how many screenshots of comments we need to make.
    return length, com