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)
    """
    try:
        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)

    except Exception as e:
        return jsonify({"error": str(e)}), 500


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

if __name__ == "__main__":
    # If arguments provided → run Flask API
    if len(sys.argv) > 1 and sys.argv[1] == "serve":
        app.run(host="0.0.0.0", port=5001, debug=True)
    else:
        # Local test mode (same as your current script)
        face_path = "input_face.mp4"
        audio_path = "input_audio.wav"
        output_path = "output_sync.mp4"

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