import os
import tempfile
from flask import Flask, request, jsonify
from werkzeug.utils import secure_filename
from functools import wraps
import logging
from extract_contract_info import process_file

# --- Config ---
API_KEY = os.environ.get("CONTRACT_EXTRACTOR_API_KEY", "change_me_now")
MAX_CONTENT_LENGTH = 20 * 1024 * 1024  # 20 MB max upload
ALLOWED_EXTENSIONS = {'pdf', 'docx'}

# --- Logging to console ---
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger(__name__)

app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = MAX_CONTENT_LENGTH

# --- Helpers ---
def allowed_filename(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

def require_api_key(fn):
    @wraps(fn)
    def wrapper(*args, **kwargs):
        key = request.headers.get("X-API-KEY", "")
        if key != API_KEY:
            return jsonify({"error": "Unauthorized"}), 401
        return fn(*args, **kwargs)
    return wrapper

# --- Routes ---
@app.route("/health", methods=["GET"])
def health():
    return jsonify({"status": "ok"}), 200

@app.route("/extract", methods=["POST"])
@require_api_key
def extract():
    if 'file' not in request.files:
        return jsonify({"error": "No file part"}), 400

    uploaded = request.files['file']
    if uploaded.filename == '':
        return jsonify({"error": "No selected file"}), 400

    filename = secure_filename(uploaded.filename)
    if not allowed_filename(filename):
        return jsonify({"error": "Unsupported file type"}), 400

    # --- Use temporary file, automatically deleted ---
    suffix = os.path.splitext(filename)[1]
    with tempfile.NamedTemporaryFile(delete=True, suffix=suffix) as tmpf:
        uploaded.save(tmpf.name)
        tmp_path = tmpf.name
        try:
            logger.info(f"Processing uploaded file: {filename}")
            result = process_file(tmp_path)
            if not isinstance(result, dict):
                logger.error("Extractor returned non-dict result")
                return jsonify({"error": "Internal processing error"}), 500
            return jsonify(result), 200
        except Exception as e:
            logger.exception("Unhandled exception during extraction")
            return jsonify({"error": "Server error", "details": str(e)}), 500

# --- Run server ---
if __name__ == "__main__":
    logger.info("Starting Flask API on http://195.35.9.96:5000")
    app.run(host="195.35.9.96", port=5000, debug=True)
