#!/usr/bin/env python3
"""
Odbiornik na DOMOWYM serwerze — trwale przechowuje pelne zdjecia weselne.

Dostepny TYLKO z VPS przez WireGuard (subnet 10.50.0.0/24). Kazde zadanie
wymaga naglowka X-WR-Secret zgodnego z WR_HOME_SECRET.

Endpointy:
  POST /recv        (multipart: photo + name)  -> zapis do archiwum
  GET  /get/<name>                              -> oddaje pelne zdjecie (proxy VPS)
  POST /del/<name>                              -> kasuje zdjecie
  GET  /health                                  -> 200 OK

Zmienne srodowiskowe:
  WR_HOME_SECRET    wspolny sekret (taki sam jak na VPS)
  WR_ARCHIVE_DIR    katalog archiwum (domyslnie ./archive)
"""

import os
from pathlib import Path
from functools import wraps

from flask import Flask, request, jsonify, send_from_directory, abort

SECRET      = os.environ.get("WR_HOME_SECRET", "")
ARCHIVE_DIR = Path(os.environ.get("WR_ARCHIVE_DIR",
                                  Path(__file__).resolve().parent / "archive"))
ARCHIVE_DIR.mkdir(parents=True, exist_ok=True)

app = Flask(__name__)
app.config["MAX_CONTENT_LENGTH"] = 30 * 1024 * 1024


def require_secret(fn):
    @wraps(fn)
    def wrapper(*a, **k):
        if not SECRET or request.headers.get("X-WR-Secret") != SECRET:
            abort(403)
        return fn(*a, **k)
    return wrapper


def safe(name):
    if "/" in name or "\\" in name or name.startswith("."):
        abort(400)
    return name


@app.route("/recv", methods=["POST"])
@require_secret
def recv():
    file = request.files.get("photo")
    name = safe(request.form.get("name", ""))
    if not file or not name:
        return jsonify(error="brak pliku lub nazwy"), 400
    file.save(ARCHIVE_DIR / name)
    return jsonify(ok=True)


@app.route("/get/<path:name>")
@require_secret
def get(name):
    name = safe(name)
    if not (ARCHIVE_DIR / name).exists():
        abort(404)
    return send_from_directory(ARCHIVE_DIR, name, max_age=86400)


@app.route("/del/<path:name>", methods=["POST"])
@require_secret
def delete(name):
    name = safe(name)
    try:
        (ARCHIVE_DIR / name).unlink()
    except FileNotFoundError:
        return jsonify(ok=True), 404
    return jsonify(ok=True)


@app.route("/health")
def health():
    return jsonify(ok=True)


if __name__ == "__main__":
    # lokalnie do testow; produkcyjnie przez gunicorn (patrz DEPLOY.md)
    app.run(host="0.0.0.0", port=8021, debug=True)
