import os
import sys
import argparse
import requests
from PIL import Image
from moviepy.editor import *
import tempfile

def download_images(image_urls, temp_dir):
    paths = []
    for i, url in enumerate(image_urls):
        try:
            res = requests.get(url)
            img_path = os.path.join(temp_dir, f'image_{i}.jpg')
            with open(img_path, 'wb') as f:
                f.write(res.content)
            paths.append(img_path)
        except Exception as e:
            print(f"Failed to download {url}: {e}")
    return paths

def create_video(image_urls, audio_path, tts_text, output_path,
                 zoom_duration=5.0, font_size=48, font="Arial", font_color="white", alt_color="yellow"):

    with tempfile.TemporaryDirectory() as tmpdir:
        image_paths = download_images(image_urls, tmpdir)

        # Create image clips with zoom
        clips = []
        for path in image_paths:
            img = Image.open(path)
            clip = ImageClip(path, duration=zoom_duration).resize(height=720).set_position("center")
            clip = clip.fx(vfx.zoom_in, final_scale=1.1, duration=zoom_duration)
            clips.append(clip)

        # Combine video
        video = concatenate_videoclips(clips, method="compose")

        # Add audio
        audio = AudioFileClip(audio_path)
        video = video.set_audio(audio)

        # Caption
        switch_time = video.duration / 2
        caption1 = TextClip(tts_text, fontsize=font_size, color=font_color, font=font, method='caption', size=(1280, None)).set_duration(switch_time).set_position("bottom")
        caption2 = TextClip(tts_text, fontsize=font_size, color=alt_color, font=font, method='caption', size=(1280, None)).set_start(switch_time).set_duration(video.duration - switch_time).set_position("bottom")

        final = CompositeVideoClip([video, caption1, caption2])
        final.write_videofile(output_path, fps=24)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Make zoom video from image URLs with TTS and audio")
    parser.add_argument('--images', nargs='+', required=True, help='List of image URLs')
    parser.add_argument('--audio', required=True, help='Path to MP3 file')
    parser.add_argument('--text', required=True, help='TTS caption text')
    parser.add_argument('--output', default='output_video.mp4', help='Output video filename')
    parser.add_argument('--font', default='Arial', help='Font name')
    parser.add_argument('--fontsize', type=int, default=48, help='Font size')
    parser.add_argument('--color1', default='white', help='Primary caption color')
    parser.add_argument('--color2', default='yellow', help='Secondary caption color')
    parser.add_argument('--duration', type=float, default=5.0, help='Zoom duration per image')

    args = parser.parse_args()

    create_video(
        image_urls=args.images,
        audio_path=args.audio,
        tts_text=args.text,
        output_path=args.output,
        zoom_duration=args.duration,
        font_size=args.fontsize,
        font=args.font,
        font_color=args.color1,
        alt_color=args.color2
    )
