#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
=============================================================================
اسکریپت بسته‌بندی خودکار آپدیت پروژه بازی امپراتور جنگ‌ها (Make Update Pack)
=============================================================================
این اسکریپت تمام فایل‌های سورس پروژه را جهت آپلود و اعمال هوشمند در setup.php بسته‌بندی می‌کند.
فایل‌های حساس مانند config.php، بکاپ‌ها، فایل‌های لاگ و موارد موقت به صورت خودکار فیلتر می‌شوند.
"""

import os
import zipfile
import datetime

# دایرکتوری ریشه پروژه
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# نام فایل خروجی زیپ
OUTPUT_ZIP = os.path.join(BASE_DIR, "update_pack.zip")

# نام‌های دقیق فایل‌هایی که هرگز نباید در بسته آپدیت قرار بگیرند
EXCLUDE_EXACT = {
    "config.php",
    "db_config.json",
    "update_pack.zip",
    "update.zip",
    "make_update.py",
    ".DS_Store",
    ".gitignore",
    "ar.php",
    "acceleration_backup.php",
    "war_errors.log",
    "webhook_setup.php",
    "last_auto_check.txt",
    "last_queue_check.txt"
}

# پوشه‌های مستثنی
EXCLUDE_DIRS = {
    ".git",
    "backups",
    "bac3",
    "backuo1",
    "tmp",
    "logs",
    "__pycache__",
    ".idea",
    ".vscode"
}

# پسوندهای غیرمجاز
EXCLUDE_EXTENSIONS = {
    ".bak",
    ".log",
    ".tmp",
    ".swp"
}

def should_exclude(rel_path):
    clean_path = rel_path.replace("\\", "/").lower()
    parts = clean_path.split("/")

    # ۱. بررسی پوشه‌های مستثنی
    for part in parts:
        if part in EXCLUDE_DIRS:
            return True

    # ۲. بررسی فایل‌های دقیق
    filename = os.path.basename(rel_path)
    if filename in EXCLUDE_EXACT:
        return True
    if filename.startswith("backup_") and filename.endswith(".zip"):
        return True
    if filename.startswith("user_state_") and filename.endswith(".txt"):
        return True

    # ۳. فیلتر کردن فایل‌های حجیم کاربران درون Data
    if clean_path.startswith("data/users.json") or clean_path.startswith("data/war.json"):
        # دیتابیس کاربری در هاست نباید بازنویسی شود
        return True

    # ۴. بررسی پسوندها
    _, ext = os.path.splitext(filename)
    if ext.lower() in EXCLUDE_EXTENSIONS:
        return True

    return False

def make_update_zip():
    print("=" * 70)
    print("🚀 در حال ساخت بسته آپدیت هوشمند پروژه امپراتور جنگ‌ها برای سرور...")
    print("=" * 70)

    packed_files = []
    skipped_files = []

    with zipfile.ZipFile(OUTPUT_ZIP, "w", zipfile.ZIP_DEFLATED) as zf:
        for root, dirs, files in os.walk(BASE_DIR):
            # حذف پوشه‌های مستثنی از پیمایش
            dirs[:] = [
                d for d in dirs 
                if d.lower() not in EXCLUDE_DIRS 
                and not d.startswith(".")
            ]

            for file in sorted(files):
                full_path = os.path.join(root, file)
                rel_path = os.path.relpath(full_path, BASE_DIR)

                if should_exclude(rel_path):
                    skipped_files.append(rel_path)
                    continue

                zf.write(full_path, rel_path)
                packed_files.append(rel_path)

    zip_size_kb = os.path.getsize(OUTPUT_ZIP) / 1024
    zip_size_mb = zip_size_kb / 1024

    print(f"\n✅ بسته آپدیت با موفقیت ساخته شد: update_pack.zip")
    print(f"📦 تعداد فایل‌های بسته‌بندی شده: {len(packed_files)} فایل")
    print(f"📊 حجم نهایی فایل فشرده: {zip_size_mb:.2f} MB ({zip_size_kb:.1f} KB)")
    print(f"🛡️ فایل‌های حساس هاست مستثنی شدند: config.php, db_config.json, Data/users.json, backups/")

    print("\n" + "-" * 70)
    print("📌 نحوه اعمال آپدیت روی هاست:")
    print("  ۱. وارد صفحه setup.php در مرورگر خود شوید.")
    print("  ۲. فایل update_pack.zip را در بخش «مرکز آپدیت هوشمند» درگ کرده یا انتخاب کنید.")
    print("  ۳. پیش‌نمایش تغییرات را مشاهده و دکمه «اعمال قطعی آپدیت» را بزنید.")
    print("-" * 70 + "\n")

if __name__ == "__main__":
    make_update_zip()
