# app/utils/file_utils.py

import os
from werkzeug.utils import secure_filename
from flask import current_app
from datetime import datetime
import uuid
from PIL import Image


ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'}
MAX_FILE_SIZE = 5 * 1024 * 1024  # 5MB


def allowed_file(filename):
    """بررسی فرمت مجاز فایل"""
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


def save_uploaded_file(file, subfolder='uploads'):
    """
    ذخیره فایل آپلود شده
    
    Args:
        file: فایل آپلود شده
        subfolder: زیرپوشه برای ذخیره (مثلاً 'advertisements')
    
    Returns:
        str: مسیر نسبی فایل ذخیره شده
    """
    if not file or not allowed_file(file.filename):
        return None
    
    # بررسی حجم فایل
    file.seek(0, os.SEEK_END)
    file_size = file.tell()
    file.seek(0)
    
    if file_size > MAX_FILE_SIZE:
        return None
    
    # ایجاد نام فایل
    filename = secure_filename(file.filename)
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    unique_id = str(uuid.uuid4())[:8]
    extension = filename.rsplit('.', 1)[1].lower()
    new_filename = f"{subfolder[:-1]}_{timestamp}_{unique_id}.{extension}"
    
    # ایجاد مسیر کامل
    upload_folder = os.path.join(current_app.static_folder, subfolder)
    os.makedirs(upload_folder, exist_ok=True)
    
    file_path = os.path.join(upload_folder, new_filename)
    
    # ذخیره فایل
    file.save(file_path)
    
    # بهینه‌سازی تصویر (اختیاری)
    try:
        if extension in {'jpg', 'jpeg', 'png'}:
            img = Image.open(file_path)
            img.save(file_path, quality=85, optimize=True)
    except:
        pass
    
    # بازگشت مسیر نسبی
    return os.path.join(subfolder, new_filename).replace('\\', '/')


def delete_uploaded_file(file_path):
    """حذف فایل آپلود شده"""
    if not file_path:
        return False
    
    full_path = os.path.join(current_app.static_folder, file_path)
    try:
        if os.path.exists(full_path):
            os.remove(full_path)
            return True
    except Exception as e:
        print(f"Error deleting file: {e}")
    
    return False


def get_file_url(file_path):
    """دریافت URL کامل فایل"""
    if not file_path:
        return None
    return url_for('static', filename=file_path)