"""ذخیره‌سازی عکس مشتری — روی دیسک محلی (پیش‌فرض) یا S3/R2 (پیکربندی‌پذیر برای دیپلوی).

فقط «کلید» فایل ذخیره‌شده در Customer.photo_path نگه داشته می‌شود، نه مسیر مطلق —
تا تغییر بک‌اند ذخیره‌سازی بدون تغییر دیتابیس ممکن باشد.
"""
import uuid
from pathlib import Path

from flask import current_app, send_from_directory
from PIL import Image

ALLOWED_EXT = {"png", "jpg", "jpeg", "webp"}
MAX_DIMENSION = 640


def allowed_file(filename: str) -> bool:
    return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXT


def save_photo(file_storage, customer_id: int) -> str:
    """عکس را ذخیره و کلید ذخیره‌شده را برمی‌گرداند."""
    ext = file_storage.filename.rsplit(".", 1)[1].lower()
    key = f"{customer_id}-{uuid.uuid4().hex[:8]}.{ext}"

    backend = current_app.config["PHOTO_STORAGE_BACKEND"]
    if backend == "local":
        photo_dir = current_app.config["LOCAL_PHOTO_DIR"]
        photo_dir.mkdir(parents=True, exist_ok=True)
        dest = photo_dir / key
        img = Image.open(file_storage.stream)
        img.thumbnail((MAX_DIMENSION, MAX_DIMENSION))
        img = img.convert("RGB") if img.mode in ("RGBA", "P") else img
        img.save(dest, quality=88)
        return key

    raise NotImplementedError(f"Photo storage backend '{backend}' not implemented yet")


def serve_photo(key: str):
    backend = current_app.config["PHOTO_STORAGE_BACKEND"]
    if backend == "local":
        return send_from_directory(current_app.config["LOCAL_PHOTO_DIR"], key)
    raise NotImplementedError(f"Photo storage backend '{backend}' not implemented yet")


def photo_exists(key: str) -> bool:
    if not key:
        return False
    backend = current_app.config["PHOTO_STORAGE_BACKEND"]
    if backend == "local":
        return (Path(current_app.config["LOCAL_PHOTO_DIR"]) / key).exists()
    return False
