import os
import whisper
from yt_dlp import YoutubeDL
import openai
import json

# Configuración de la API de OpenAI
openai.api_key = "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"

# Archivo JSON donde se guardará la información
script_directory = os.path.dirname(os.path.abspath(__file__))
json_path = os.path.join(script_directory, "datasetsG.json")

# Cargar JSON existente o inicializar uno nuevo
if not os.path.exists(json_path):
    # Crear el archivo si no existe y agregar estructura inicial
    with open(json_path, "w", encoding="utf-8") as json_file:
        json.dump({"Tipo General": []}, json_file, ensure_ascii=False, indent=4)

with open(json_path, "r", encoding="utf-8") as json_file:
    json_data = json.load(json_file)

# Función para agregar un nuevo tema con su estructura básica
def agregar_tema(tema, descripcion_tema, info_pqrsf):
    tema_existente = next((t for t in json_data["Tipo General"] if t["Tema"] == tema), None)
    if not tema_existente:
        json_data["Tipo General"].append({
            "Tema": tema,
            "Descripcion Tema": descripcion_tema,
            "Info PQRSF": info_pqrsf,
            "Lecciones": []
        })

# Función para agregar una lección a un tema específico
def agregar_leccion(tema, numero_leccion, descripcion, contenido, resumen, media):
    tema_obj = next((t for t in json_data["Tipo General"] if t["Tema"] == tema), None)
    if tema_obj:
        tema_obj["Lecciones"].append({
            "Leccion": f"Leccion {numero_leccion}",
            "Descripcion": descripcion,
            "Contenido": contenido,
            "Resumen": resumen,
            "Media": media
        })

# Función para transcribir el video de YouTube
def transcribir_video_youtube(url_video):
    # Configuración para descargar solo el audio
    ydl_opts = {
        'format': 'bestaudio/best',
        'outtmpl': 'audio.%(ext)s',
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192',
        }],
    }

    with YoutubeDL(ydl_opts) as ydl:
        ydl.download([url_video])

    # El archivo descargado será 'audio.mp3'
    nombre_archivo = 'audio.mp3'

    # Cargar el modelo de Whisper
    modelo = whisper.load_model("base")

    # Transcribir el audio
    resultado = modelo.transcribe(nombre_archivo, language='es')

    # Eliminar el archivo de audio descargado
    os.remove(nombre_archivo)

    return resultado['text']

# Función para generar resumen usando GPT-4 (actualizado)
def generar_resumen(contenido):
    prompt = f"Proporciona un resumen breve y claro del siguiente texto:\n\n{contenido}"
    try:
        response = openai.ChatCompletion.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": "Eres un asistente especializado en generar resúmenes."},
                {"role": "user", "content": prompt}
            ]
        )
        resumen = response["choices"][0]["message"]["content"]
        return resumen.strip()
    except Exception as e:
        print(f"Error al generar resumen: {e}")
        return "Error al generar resumen"

# Interfaz interactiva para decidir si agregar un nuevo tema o una nueva lección
decision = input("¿Deseas agregar un nuevo tema? (si/no): ").strip().lower()

if decision == "si":
    tema = input("Ingresa el título del nuevo tema: ").strip()
    descripcion_tema = input("Ingresa la descripción del nuevo tema: ").strip()
    info_pqrsf = input("Ingresa la información PQRSF para este tema: ").strip()

    # Agregar el tema si no existe
    agregar_tema(tema, descripcion_tema, info_pqrsf)
else:
    tema = input("Ingresa el título del tema existente donde deseas agregar la lección: ").strip()

# Obtener datos de la lección
numero_leccion = input("Ingresa el número de la lección: ").strip()
descripcion_leccion = input("Ingresa la descripción de la lección: ").strip()
url = input("Ingresa la URL del video de YouTube: ").strip()

# Transcribir el video
transcripcion = transcribir_video_youtube(url)
print("Transcripción obtenida.")

# Generar el resumen con GPT-4
resumen = generar_resumen(transcripcion)
print("Resumen generado.")

# Agregar la lección al tema
agregar_leccion(tema, numero_leccion, descripcion_leccion, transcripcion, resumen, url)

# Guardar el JSON actualizado en el archivo
with open(json_path, "w", encoding="utf-8") as json_file:
    json.dump(json_data, json_file, ensure_ascii=False, indent=4)

print(f"JSON guardado en: {json_path}")
