/**
 * سیستم یادآوری دقیق و خودکار
 */
const { REMINDER_CHECK_INTERVAL } = require('./config');
const { getPendingReminders, markTaskReminded, getTasksNotDoneAfterReminder, markReminderSent, loadTasks } = require('./database');
const { formatReminderMessage } = require('./messages');
const path = require('path');
const { InputFile } = require('telegraf');

function isWakeUpTime(hour) {
    return hour < 6 || hour === 2;
}

async function sendReminder(bot, userId, taskIndex, task) {
    try {
        console.log('📤 ارسال یادآوری برای کار:', task.task, 'به کاربر:', userId);

        const taskTime = new Date(task.time);
        const hour = taskTime.getHours();

        const isWakeUp = isWakeUpTime(hour);
        console.log('🌅 زمان بیدار شدن:', isWakeUp, 'ساعت:', hour);

        // تحلیل هوشمند برای شخصی‌سازی پیام
        const analytics = require('./analytics');
        const patterns = analytics.detectBehavioralPatterns(userId);
        const gamification = require('./gamification');
        const userStats = gamification.getUserStats(userId);

        // فرمت پیام هوشمند
        const message = formatSmartReminderMessage(task.task, isWakeUp, patterns, userStats);
        console.log('💬 پیام یادآوری هوشمند:', message);

        // دکمه‌های هوشمند بر اساس وضعیت کاربر
        const keyboard = generateSmartKeyboard(taskIndex, patterns, userStats);

        // ارسال پیام با retry
        console.log('📨 ارسال پیام به تلگرام...');
        let result;
        const maxRetries = 3;

        for (let attempt = 1; attempt <= maxRetries; attempt++) {
            try {
                result = await bot.telegram.sendMessage(userId, message, {
                    reply_markup: keyboard
                });
                console.log('✅ پیام ارسال شد، نتیجه:', result.message_id);
                break; // موفقیت
            } catch (error) {
                console.error(`❌ تلاش ${attempt}/${maxRetries} ناموفق:`, error.message);

                if (attempt === maxRetries) {
                    throw error; // آخرین تلاش شکست خورد
                }

                // انتظار قبل از تلاش مجدد
                const delay = Math.min(1000 * Math.pow(2, attempt), 10000);
                console.log(`⏳ انتظار ${delay}ms قبل از تلاش مجدد...`);
                await new Promise(resolve => setTimeout(resolve, delay));
            }
        }

        // ارسال استیکر بعد از پیام
        try {
            const stickerPath = path.join(__dirname, 'stik/3.webp');
            const fs = require('fs');
            const stickerBuffer = fs.readFileSync(stickerPath);
            await bot.telegram.sendSticker(userId, { source: stickerBuffer });
            console.log('✅ استیکر یادآوری ارسال شد');
        } catch (error) {
            console.error('⚠️ خطا در ارسال استیکر یادآوری:', error);
            console.error('🔍 جزئیات خطا:', error.message);
        }

        // علامت‌گذاری به عنوان یادآوری شده
        console.log('🏷️ علامت‌گذاری کار به عنوان یادآوری شده...');
        markTaskReminded(userId, taskIndex);
        console.log('✅ کار علامت‌گذاری شد');

    } catch (error) {
        console.error('❌ خطا در ارسال یادآوری:', error);
        console.error('🔍 جزئیات خطا:', error.response?.body || error.message);

        // اگر کاربر ربات را بلاک کرده، آن را علامت‌گذاری نکنیم
        if (error.code === 403) {
            console.log('🚫 کاربر ربات را بلاک کرده، یادآوری متوقف شد');
            // می‌توانیم در آینده این کاربر را از لیست یاداوری حذف کنیم
        } else {
            // برای سایر خطاها، کار را همچنان علامت‌گذاری می‌کنیم تا دوباره امتحان نشود
            markTaskReminded(userId, taskIndex);
        }
    }
}

// تولید پیام یادآوری هوشمند
function formatSmartReminderMessage(task, isWakeUp, patterns, userStats) {
    let baseMessage;

    if (isWakeUp) {
        const wakeUpMessages = [
            "🌅 مائده جان! صبح بخیر گلم! وقت بیدار شدنه 💕",
            "☀️ مائده! صبحت بخیر عزیزم! روز جدید رو شروع کنیم! 😘",
            "🌄 مائده گلم! وقتشه از خواب بیدار شی! 🌹"
        ];
        baseMessage = wakeUpMessages[Math.floor(Math.random() * wakeUpMessages.length)];
    } else {
        // پیام بر اساس عملکرد کاربر
        if (userStats.completionRate >= 80) {
            baseMessage = "مائده گلم! تو که همیشه منظمی! 💪";
        } else if (patterns.procrastinator) {
            baseMessage = "مائده جانم! دیگه تعویق نیانداز! ⏰";
        } else if (patterns.consistent) {
            baseMessage = "مائده عزیزم! مثل همیشه منظمی! 🎯";
        } else {
            baseMessage = "مائده گلم! یادت نره این کارو انجام بدی! 💕";
        }
    }

    // اضافه کردن اطلاعات امتیاز
    const scoreMessage = userStats.points > 0 ? ` (امتیازت: ${userStats.points} ⭐)` : '';

    return `${baseMessage}\n\n📋 «${task}»\n\nوقتی انجامش دادی، دکمه "انجام شد" رو بزن!${scoreMessage}`;
}

// تولید کیبورد هوشمند
function generateSmartKeyboard(taskIndex, patterns, userStats) {
    const baseKeyboard = [
        { text: 'حواسم هست ✅', callback_data: `aware|${taskIndex}` },
        { text: 'انجام شد 🎉', callback_data: `done|${taskIndex}` }
    ];

    // اضافه کردن دکمه‌های هوشمند بر اساس وضعیت
    const smartButtons = [];

    // اگر procrastinator هست، دکمه انگیزشی اضافه کن
    if (patterns.procrastinator) {
        smartButtons.push({ text: 'حالا انجام می‌دم! 💪', callback_data: `motivate|${taskIndex}` });
    }

    // اگر امتیاز داره، دکمه آمار اضافه کن
    if (userStats.points > 0) {
        smartButtons.push({ text: 'آمار من 📊', callback_data: `stats|${taskIndex}` });
    }

    // اگر consistent هست، دکمه پیشنهاد اضافه کن
    if (patterns.consistent) {
        smartButtons.push({ text: 'پیشنهاد بده 💡', callback_data: `suggest|${taskIndex}` });
    }

    // ترکیب دکمه‌ها
    const allButtons = [...baseKeyboard];
    if (smartButtons.length > 0) {
        allButtons.push(...smartButtons.slice(0, 2)); // حداکثر 2 دکمه اضافی
    }

    return {
        inline_keyboard: [allButtons]
    };
}

function formatDateTime(date) {
    // فرمت: YYYY-MM-DD HH:MM
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    const hours = String(date.getHours()).padStart(2, '0');
    const minutes = String(date.getMinutes()).padStart(2, '0');
    return `${year}-${month}-${day} ${hours}:${minutes}`;
}

// ارسال یادآوری بعد از 2 دقیقه برای کارهای انجام نشده
async function sendLazyReminder(bot, userId, taskIndex, task) {
    try {
        console.log('😤 ارسال یادآوری تنبل برای کار:', task.task, 'به کاربر:', userId);

        // پیام‌های جالب و متفاوت برای یادآوری تنبل
        const lazyMessages = [
            `😴 ای خواب‌زده! کار «${task.task}» رو یادت رفته؟ زود بجنب! 💪`,
            `👀 کجایی تو؟ کار «${task.task}» منتظرته! یادت رفته؟ 😅`,
            `⏰ وقتشه بجنبی! کار «${task.task}» رو انجام ندادی هنوز! 🏃‍♀️`,
            `😤 ذلیل مرده! کار «${task.task}» رو فراموش کردی؟ زود انجامش بده! 💕`,
            `🚨 هشدار قرمز! کار «${task.task}» انجام نشده مونده! ⚡`,
            `😴 از خواب بیدار شو! کار «${task.task}» منتظره! 🌟`,
            `🎯 تمرکزتو جمع کن! کار «${task.task}» رو یادت نره! 🎪`,
            `⏳ زمان داره می‌گذره! کار «${task.task}» رو سریع انجام بده! 🕐`
        ];

        const randomMessage = lazyMessages[Math.floor(Math.random() * lazyMessages.length)];
        const message = `${randomMessage}\n\n💡 اگر حواست هست، دکمه "حواسم هست" رو بزن!`;

        await bot.telegram.sendMessage(userId, message, {
            reply_markup: {
                inline_keyboard: [
                    [{ text: 'حواسم هست! ✅', callback_data: `aware|${taskIndex}` }],
                    [{ text: 'الان انجام می‌دم! 💪', callback_data: `done|${taskIndex}` }]
                ]
            }
        });

        // ارسال استیکر تنبل
        try {
            const stickerPath = path.join(__dirname, 'stik/6.webp');
            const stickerFile = new InputFile(stickerPath);
            await bot.telegram.sendSticker(userId, stickerFile);
            console.log('✅ استیکر تنبل ارسال شد');
        } catch (error) {
            console.error('⚠️ خطا در ارسال استیکر تنبل:', error);
            console.error('🔍 جزئیات خطا:', error.message);
        }

        // علامت‌گذاری که یادآوری 2 دقیقه‌ای ارسال شده
        markReminderSent(userId, taskIndex);
        console.log('✅ یادآوری تنبل ارسال شد برای کار:', task.task);

    } catch (error) {
        console.error('❌ خطا در ارسال یادآوری تنبل:', error);
    }
}

// بازیابی یادآوری‌های از دست رفته در شروع
async function recoverMissedReminders(bot) {
    console.log('🔄 بررسی یادآوری‌های از دست رفته...');

    try {
        const tasks = loadTasks();
        const now = new Date();
        let recoveredCount = 0;

        for (const [userId, userTasks] of Object.entries(tasks)) {
            for (let i = 0; i < userTasks.length; i++) {
                const task = userTasks[i];

                // کارهایی که زمانش گذشته ولی یادآوری نشده
                if (!task.done && !task.reminded) {
                    const taskTime = new Date(task.time.replace(' ', 'T'));
                    const timeDiff = (now - taskTime) / (1000 * 60); // تفاوت به دقیقه

                    // اگر حداکثر 30 دقیقه تأخیر داشته، یادآوری کن
                    if (timeDiff >= 0 && timeDiff <= 30) {
                        console.log('🔧 بازیابی یادآوری از دست رفته برای:', task.task, 'تأخیر:', Math.round(timeDiff), 'دقیقه');
                        await sendReminder(bot, userId, i, task);
                        recoveredCount++;
                    }
                }
            }
        }

        console.log('✅ تعداد یادآوری‌های بازیابی شده:', recoveredCount);

    } catch (error) {
        console.error('❌ خطا در بازیابی یادآوری‌ها:', error);
    }
}

function startReminderSystem(bot) {
    console.log('🔄 سیستم یادآوری پیشرفته شروع شد...');
    console.log('⏱️ بازه چک:', REMINDER_CHECK_INTERVAL, 'ثانیه');

    // بازیابی یادآوری‌های از دست رفته
    setTimeout(() => recoverMissedReminders(bot), 5000); // بعد از 5 ثانیه شروع کن

    // ذخیره تایمرها برای جلوگیری از memory leak
    let reminderInterval;
    let lazyReminderInterval;

    // تابع چک یادآوری‌های اصلی
    const checkReminders = () => {
        try {
            const now = new Date();
            const currentTime = formatDateTime(now);

            console.log('🔍 چک یادآوری‌ها در زمان:', currentTime);

            // دریافت یادآوری‌های در انتظار
            const reminders = getPendingReminders();
            console.log('📋 یادآوری‌های در انتظار:', reminders.length);

            reminders.forEach(([userId, taskIndex, task]) => {
                console.log('⏰ چک کار:', task.task, 'زمان:', task.time, '===', currentTime);

                // چک کردن اینکه زمان دقیقاً رسیده یا حداکثر 30 ثانیه تأخیر داشته
                const taskTime = new Date(task.time.replace(' ', 'T'));
                const timeDiff = Math.abs(now - taskTime) / 1000; // تفاوت به ثانیه

                if (task.time === currentTime || (timeDiff <= 60 && !task.reminded)) {
                    console.log('🎯 زمان یادآوری رسید! ارسال به کاربر:', userId, 'تأخیر:', Math.round(timeDiff), 'ثانیه');
                    // ارسال یادآوری
                    sendReminder(bot, userId, taskIndex, task).catch(err => {
                        console.error('خطا در ارسال یادآوری:', err);
                    });
                }
            });

        } catch (error) {
            console.error('❌ خطا در حلقه یادآوری:', error);
        }
    };

    // تابع چک یادآوری‌های تنبل (2 دقیقه بعد)
    const checkLazyReminders = () => {
        try {
            console.log('😤 چک کردن کارهای انجام نشده بعد از 2 دقیقه...');

            const notDoneTasks = getTasksNotDoneAfterReminder(2);
            console.log('📋 کارهای انجام نشده:', notDoneTasks.length);

            notDoneTasks.forEach(([userId, taskIndex, task]) => {
                console.log('😤 ارسال یادآوری تنبل برای کار:', task.task, 'کاربر:', userId);
                sendLazyReminder(bot, userId, taskIndex, task).catch(err => {
                    console.error('❌ خطا در ارسال یادآوری تنبل:', err);
                });
            });

        } catch (error) {
            console.error('❌ خطا در چک کردن کارهای انجام نشده:', error);
        }
    };

    // شروع تایمرها
    reminderInterval = setInterval(checkReminders, REMINDER_CHECK_INTERVAL * 1000);
    lazyReminderInterval = setInterval(checkLazyReminders, REMINDER_CHECK_INTERVAL * 1000);

    // اطمینان از اجرای فوری در شروع
    setTimeout(checkReminders, 1000); // بعد از 1 ثانیه شروع کن
    setTimeout(checkLazyReminders, 2000); // بعد از 2 ثانیه شروع کن

    console.log('✅ تایمرهای یادآوری فعال شدند');

    // تابع پاکسازی برای graceful shutdown
    const cleanup = () => {
        if (reminderInterval) {
            clearInterval(reminderInterval);
            console.log('🧹 تایمر یادآوری پاک شد');
        }
        if (lazyReminderInterval) {
            clearInterval(lazyReminderInterval);
            console.log('🧹 تایمر یادآوری تنبل پاک شد');
        }
    };

    // اضافه کردن cleanup به process
    process.on('SIGINT', cleanup);
    process.on('SIGTERM', cleanup);

    return { cleanup };
}

module.exports = {
    startReminderSystem,
    recoverMissedReminders
};

