import gradio as gr
from transformers import AutoTokenizer, AutoModelForCausalLM
from pptx import Presentation
from pptx.util import Inches
import subprocess
import os

# Specify the DeepSeek model name
DEEPSEEK_MODEL_NAME = "deepseek-ai/deepseek-llm-67b-chat"  # Replace with the correct model name

# Initialize tokenizer and model globally
try:
    tokenizer = AutoTokenizer.from_pretrained(DEEPSEEK_MODEL_NAME, padding_side='left')
    model = AutoModelForCausalLM.from_pretrained(DEEPSEEK_MODEL_NAME)
except Exception as e:
    print(f"Error loading model: {e}")

# Content Generation Function using DeepSeek
def generate_content(prompt):
    if not tokenizer or not model:
        return "Model not loaded properly."
    inputs = tokenizer.encode(prompt + tokenizer.eos_token, return_tensors='pt')
    outputs = model.generate(inputs, max_length=200, do_sample=True, temperature=0.7)
    text = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return text

# Generate Slide Titles and Content from Description
def generate_slides_from_description(title, subtitle, description):
    if not description:
        return []
    # Generate slide titles
    slide_titles_prompt = f"Generate 3 slide titles for a presentation titled '{title}' about '{description}'. Return the titles as a comma-separated list."
    slide_titles = generate_content(slide_titles_prompt).split(",")
    # Generate slide content for each title
    slides = []
    for title_slide in slide_titles:
        content_prompt = f"Generate detailed content for a slide titled '{title_slide.strip()}' about '{description}'."
        content = generate_content(content_prompt)
        slides.append({"title": title_slide.strip(), "content": content.strip()})
    return slides

# Slide Design Function
def create_presentation(title, subtitle, slides, output_dir):
    prs = Presentation()
    # Create title slide
    title_slide_layout = prs.slide_layouts[0]
    slide = prs.slides.add_slide(title_slide_layout)
    slide.shapes.title.text = title
    slide.placeholders[1].text = subtitle
    # Create content slides
    for slide_data in slides:
        content_slide_layout = prs.slide_layouts[1]
        slide = prs.slides.add_slide(content_slide_layout)
        slide.shapes.title.text = slide_data["title"]
        slide.placeholders[1].text = slide_data["content"]
    output_file = os.path.join(output_dir, "output.pptx")
    prs.save(output_file)
    return output_file

# Output Conversion Function
def convert_to_pdf(pptx_file, pdf_file):
    try:
        subprocess.run(['soffice', '--headless', '--convert-to', 'pdf', pptx_file, '--outdir', os.path.dirname(pdf_file)])
    except Exception as e:
        print(f"Error converting to PDF: {e}")

# Main Function
def main(title, subtitle, description):
    if not title or not description:
        return "Please provide a title and description.", "Please provide a title and description."
    # Generate slides from description
    slides = generate_slides_from_description(title, subtitle, description)
    if not slides:
        return "No slides generated.", "No slides generated."
    # Create presentation
    output_dir = os.getcwd()
    pptx_file = create_presentation(title, subtitle, slides, output_dir)
    # Convert to PDF
    pdf_file = os.path.join(output_dir, "output.pdf")
    convert_to_pdf(pptx_file, pdf_file)
    # Return file paths for download
    return pptx_file, pdf_file

# Gradio Interface
with gr.Blocks() as demo:
    gr.Markdown("# Presentation Generator with DeepSeek")
    title = gr.Textbox(label="Presentation Title", placeholder="Enter the title of your presentation")
    subtitle = gr.Textbox(label="Subtitle", placeholder="Enter a subtitle (optional)")
    description = gr.Textbox(label="Presentation Description", placeholder="Describe the purpose and content of your presentation")
    generate_button = gr.Button("Generate Presentation")
    output_pptx = gr.File(label="Download PPTX")
    output_pdf = gr.File(label="Download PDF")

    generate_button.click(
        main,
        inputs=[title, subtitle, description],
        outputs=[output_pptx, output_pdf]
    )

demo.launch()