import os
import json
import requests
from dotenv import load_dotenv
from celery_app import celery 

load_dotenv()
ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")

VOICE_ID = "21m00Tcm4TlvDq8ikWAM"


# Root public folder
PUBLIC_AUDIO_DIR = "./public/tmp/Audio"



@celery.task(name="audio_conversion.generate_audio_from_presentation")
def generate_audio_from_presentation(data: dict, voice_id: str = VOICE_ID) -> dict:
    session_id = data.get("id")
    if not session_id:
        raise ValueError("data must include 'id' key for session identification")

    pres_data = data.get("json")
    if not isinstance(pres_data, dict):
        raise ValueError("data must include 'json' key with presentation content")

    slides = pres_data.get("slides", [])
    print(f"Found {len(slides)} slides in presentation.")

    # --- Create per-session folder ---
    session_dir = os.path.join("./public/tmp/{session_id}/Audio".format(session_id=session_id))
    os.makedirs(session_dir, exist_ok=True)

    mapping = {}

    for slide in slides:
        slide_no = slide.get("slide_no")
        notes = slide.get("speaker_notes", "")

        if not notes.strip():
            print(f"⚠️ Slide {slide_no} has no speaker notes. Skipping...")
            continue

        print(f"🎙 Generating audio for Slide {slide_no}...")

        url = f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}"
        headers = {
            "Accept": "audio/mpeg",
            "Content-Type": "application/json",
            "xi-api-key": ELEVENLABS_API_KEY
        }
        payload = {
            "text": notes,
            "model_id": "eleven_monolingual_v1",
            "voice_settings": {"stability": 0.7, "similarity_boost": 0.8}
        }

        response = requests.post(url, headers=headers, json=payload)

        if response.status_code == 200:
            file_name = f"slide_{slide_no}.mp3"
            file_path = os.path.join(session_dir, file_name)

            with open(file_path, "wb") as f:
                f.write(response.content)

            print(f"✅ Saved: {file_path}")

            # For mapping, use relative/public-facing path
            mapping[slide_no] = f"{session_dir}/{file_name}"
        else:
            print(f"❌ Error Slide {slide_no}: {response.text}")

    # --- Save mapping JSON inside session folder ---
    mapping_file = os.path.join(session_dir, "audio_mapping.json")
    with open(mapping_file, "w", encoding="utf-8") as f:
        json.dump(mapping, f, indent=4)

    return {
        "id": session_id,
        "audio_mapping_file": mapping_file
    }
