# server.py
import base64
import io
from flask import Flask, render_template, request, send_file, abort, jsonify
from core import generate_preview, build_zip
import io, inspect, logging
logging.basicConfig(level=logging.INFO)
from flask import Response  # add this import at the top

app = Flask(__name__)

@app.route("/", methods=["GET"])
def index():
    return render_template("index.html")

@app.route("/preview", methods=["POST"])
def preview():
    data = request.get_json(force=True, silent=True)
    if not data or "image_b64" not in data:
        return jsonify({"error": "Missing image"}), 400
    try:
        raw_bytes = base64.b64decode(data["image_b64"])
    except Exception:
        return jsonify({"error": "Bad image encoding"}), 400

    params = data.get("params", {}) or {}
    try:
        resp = generate_preview(raw_bytes, params)
    except Exception as e:
        return jsonify({"error": str(e)}), 500
    return jsonify(resp)

@app.route("/download", methods=["POST"])
def download():
    image_b64 = request.form.get("image_b64")
    if not image_b64:
        abort(400, "Missing image.")
    try:
        raw_bytes = base64.b64decode(image_b64)
    except Exception:
        abort(400, "Bad image encoding.")

    params = {k: v for k, v in request.form.items() if k != "image_b64"}

    try:
        zip_bytes = build_zip(raw_bytes, params)
    except Exception as e:
        app.logger.exception("Download failed")
        return (str(e), 500, {"Content-Type": "text/plain; charset=utf-8"})

    # Return raw bytes (no BytesIO, no fileno)
    return Response(
        zip_bytes,
        mimetype="application/zip",
        headers={
            "Content-Disposition": 'attachment; filename="image2lines_output.zip"',
            "Content-Length": str(len(zip_bytes)),
            "Cache-Control": "no-store",
        },
    )

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=7860, debug=False)
