import os
import sys
from flask import Flask, request, jsonify, send_file
from werkzeug.utils import secure_filename

# import your existing function
from app.wav2lip_infer import generate_lip_sync

app = Flask(__name__)

# Directories
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
ROOT_DIR = os.path.abspath(os.path.join(BASE_DIR, ".."))

UPLOAD_VIDEO_DIR = os.path.join(ROOT_DIR, "uploads", "videos")
UPLOAD_AUDIO_DIR = os.path.join(ROOT_DIR, "uploads", "audios")
OUTPUT_DIR = os.path.join(ROOT_DIR, "outputs")

os.makedirs(UPLOAD_VIDEO_DIR, exist_ok=True)
os.makedirs(UPLOAD_AUDIO_DIR, exist_ok=True)
os.makedirs(OUTPUT_DIR, exist_ok=True)

# ---------------------- API ROUTES ----------------------

@app.route("/", methods=["GET"])
def home():
    return jsonify({
        "message": "Wav2Lip Lip-Sync API is running 🚀",
        "usage": "POST /api/lipsync with 'video' and 'audio' form-data"
    })


@app.route("/api/lipsync", methods=["POST"])
def lipsync_api():
    """
    POST /api/lipsync
    form-data:
      - video (mp4)
      - audio (wav/mp3)
    """
    if "video" not in request.files or "audio" not in request.files:
      return jsonify({"error": "Both 'video' and 'audio' files are required"}), 400

    video = request.files["video"]
    audio = request.files["audio"]

    video_path = os.path.join(UPLOAD_VIDEO_DIR, secure_filename(video.filename))
    audio_path = os.path.join(UPLOAD_AUDIO_DIR, secure_filename(audio.filename))

    video.save(video_path)
    audio.save(audio_path)

    output_filename = f"result_{os.path.splitext(video.filename)[0]}.mp4"
    output_path = os.path.join(OUTPUT_DIR, output_filename)

    print("[INFO] Starting lip-sync generation...")
    generate_lip_sync(video_path, audio_path, output_path)
    print("[DONE] Output saved to:", output_path)

    return send_file(output_path, as_attachment=True)



# ---------------------- LOCAL TEST MODE ----------------------

if __name__ == "__main__":
  app.run(host="0.0.0.0", port=5002, debug=True)
    