#!/usr/bin/env python3
"""Flask API for passport generation"""
import os, json, tempfile, subprocess
from flask import Flask, request, jsonify, send_file
from pathlib import Path

app = Flask(__name__)

BASE_DIR = Path(__file__).parent.parent
SCRIPTS = BASE_DIR / "scripts"
INPUT_DIR = BASE_DIR / "input"
OUTPUT_DIR = BASE_DIR / "output"
OUTPUT_DIR.mkdir(exist_ok=True)

CLEAN_TEMPLATE = INPUT_DIR / "m03_clean.png"

@app.route("/health")
def health():
    return jsonify({"status": "ok", "template_exists": CLEAN_TEMPLATE.exists()})

@app.route("/generate", methods=["POST"])
def generate():
    """Generate passport from JSON data"""
    try:
        data = request.get_json()
        if not data:
            return jsonify({"error": "No JSON data provided"}), 400

        # Required fields
        required = ["surname", "given_name", "nationality", "dob", "sex",
                    "birth_place", "issue_date", "expiry_date", "authority",
                    "passport_no", "type", "country_code"]
        missing = [f for f in required if f not in data]
        if missing:
            return jsonify({"error": f"Missing fields: {missing}"}), 400

        # Generate output filename
        import time
        out_name = f"passport_{data['passport_no']}_{int(time.time())}.png"
        out_path = OUTPUT_DIR / out_name

        # Run write_passport.py
        cmd = [
            "python3", str(SCRIPTS / "write_passport.py"),
            "--img", str(CLEAN_TEMPLATE),
            "--out", str(out_path),
            "--data", json.dumps(data),
            "--skip-header"
        ]
        result = subprocess.run(cmd, capture_output=True, text=True, cwd=BASE_DIR)
        if result.returncode != 0:
            return jsonify({"error": result.stderr}), 500

        return jsonify({
            "success": True,
            "output": out_name,
            "download_url": f"/download/{out_name}"
        })

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

@app.route("/download/<filename>")
def download(filename):
    path = OUTPUT_DIR / filename
    if not path.exists():
        return jsonify({"error": "File not found"}), 404
    return send_file(path, as_attachment=True)

@app.route("/batch", methods=["POST"])
def batch():
    """Batch generate from list of JSON objects"""
    try:
        items = request.get_json()
        if not isinstance(items, list):
            return jsonify({"error": "Expected JSON array"}), 400

        results = []
        for data in items:
            out_name = f"passport_{data.get('passport_no','unknown')}_{int(time.time()*1000)}.png"
            out_path = OUTPUT_DIR / out_name
            cmd = [
                "python3", str(SCRIPTS / "write_passport.py"),
                "--img", str(CLEAN_TEMPLATE),
                "--out", str(out_path),
                "--data", json.dumps(data),
                "--skip-header"
            ]
            result = subprocess.run(cmd, capture_output=True, text=True, cwd=BASE_DIR)
            results.append({
                "passport_no": data.get("passport_no"),
                "success": result.returncode == 0,
                "output": out_name if result.returncode == 0 else None,
                "error": result.stderr if result.returncode != 0 else None
            })
        return jsonify({"results": results})

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

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8082)