import os
import shutil
from datetime import datetime, timedelta
from aiogram import Bot
from aiogram.types import FSInputFile
from sqlalchemy import select, func

from core.config import config
from database.database import AsyncSessionLocal
from database.models import Order, Product, User

def cleanup_old_backups(backup_dir: str, keep_count: int = 24):
    """حذف بکاپ‌های قدیمی محلی برای صرفه‌جویی در فضای دیسک"""
    try:
        if not os.path.exists(backup_dir):
            return
        files = [
            os.path.join(backup_dir, f) 
            for f in os.listdir(backup_dir) 
            if f.startswith("backup_") and f.endswith(".db")
        ]
        # مرتب‌سازی بر اساس زمان تغییر (قدیمی‌ترین اول)
        files.sort(key=os.path.getmtime)
        while len(files) > keep_count:
            file_to_del = files.pop(0)
            os.remove(file_to_del)
    except Exception as e:
        print(f"Error cleaning up old backups: {e}")

async def backup_database(bot: Bot):
    """بکاپ‌گیری از فایل SQLite، ذخیره در سرور محلی و ارسال به گروه ادمین‌ها"""
    db_path = "store_bot.db"
    if not os.path.exists(db_path):
        return
        
    backup_dir = "backups"
    if not os.path.exists(backup_dir):
        os.makedirs(backup_dir)
        
    backup_filename = f"backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}.db"
    backup_path = os.path.join(backup_dir, backup_filename)
    
    try:
        # کپی فایل دیتابیس به پوشه محلی بکاپ‌ها
        shutil.copy2(db_path, backup_path)
        
        # ارسال فایل بکاپ به تلگرام ادمین‌ها
        document = FSInputFile(backup_path)
        await bot.send_document(
            chat_id=config.admin_group_id,
            document=document,
            caption=f"📦 <b>بکاپ خودکار دیتابیس</b>\n🕒 تاریخ: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
        )
        
        # تمیزکاری بکاپ‌های محلی قدیمی (نگهداری ۲۴ فایل آخر)
        cleanup_old_backups(backup_dir, keep_count=24)
    except Exception as e:
        print(f"Backup Error: {e}")

async def send_daily_report(bot: Bot):
    """محاسبه آمار و درآمد واقعی ۲۴ ساعت گذشته و ارسال به گروه ادمین‌ها"""
    async with AsyncSessionLocal() as session:
        # ۲۴ ساعت گذشته
        since = datetime.utcnow() - timedelta(days=1)
        
        # تعداد کاربران جدید
        new_users_count = await session.scalar(
            select(func.count(User.id)).where(User.created_at >= since)
        ) or 0
        
        # تعداد سفارشات ثبت شده در ۲۴ ساعت اخیر
        orders_count = await session.scalar(
            select(func.count(Order.id)).where(Order.created_at >= since)
        ) or 0
        
        # مجموع درآمد (سفارشات تکمیل شده) در ۲۴ ساعت اخیر
        sales_sum = await session.scalar(
            select(func.sum(Order.amount)).where(
                Order.status == 'completed', 
                Order.created_at >= since
            )
        ) or 0
        
        # پیدا کردن ۳ محصول پرفروش ۲۴ ساعت گذشته
        stmt = select(Order.product_id, func.count(Order.id).label('sales_count'))\
            .where(Order.status == 'completed', Order.created_at >= since)\
            .group_by(Order.product_id)\
            .order_by(func.count(Order.id).desc())\
            .limit(3)
            
        best_sellers_rows = (await session.execute(stmt)).all()
        best_sellers_text = ""
        for i, row in enumerate(best_sellers_rows, 1):
            p = await session.get(Product, row.product_id)
            if p:
                best_sellers_text += f"   {i}. {p.name} ({row.sales_count} فروش)\n"
        
        if not best_sellers_text:
            best_sellers_text = "   - در ۲۴ ساعت گذشته فروشی ثبت نشده است.\n"
            
    report_text = (
        f"📊 <b>گزارش خودکار فروش روزانه (۲۴ ساعت گذشته)</b>\n"
        f"🕒 تاریخ: {datetime.now().strftime('%Y-%m-%d %H:%M')}\n"
        f"〰️〰️〰️〰️〰️〰️〰️\n"
        f"👥 <b>کاربران جدید:</b> {new_users_count} نفر\n"
        f"📦 <b>تعداد سفارشات جدید:</b> {orders_count}\n"
        f"💵 <b>مجموع فروش/درآمد:</b> {sales_sum:,.0f} تومان\n\n"
        f"🔥 <b>۳ محصول پرفروش امروز:</b>\n{best_sellers_text}"
    )
    
    try:
        await bot.send_message(chat_id=config.admin_group_id, text=report_text)
    except Exception as e:
        print(f"Daily Report Send Error: {e}")

async def check_and_fulfill_paid_orders(bot: Bot):
    """به طور خودکار سفارش‌های با وضعیت 'paid' را بررسی و تحویل می‌دهد"""
    async with AsyncSessionLocal() as session:
        stmt = select(Order).where(Order.status == 'paid')
        orders = (await session.execute(stmt)).scalars().all()
        
        for order in orders:
            try:
                # تغییر وضعیت به processing جهت جلوگیری از پردازش همزمان
                order.status = 'processing'
                await session.commit()
                
                user = await session.get(User, order.user_id)
                prod = await session.get(Product, order.product_id)
                if user and prod:
                    from handlers.shop_flow import fulfill_order
                    await fulfill_order(session, bot, order, user, prod)
                else:
                    order.status = 'pending'
                    await session.commit()
            except Exception as e:
                print(f"Error fulfilling paid order {order.id}: {e}")
                try:
                    order.status = 'pending'
                    await session.commit()
                except Exception:
                    pass

