const { Client, LocalAuth } = require('whatsapp-web.js');
const qrcode = require('qrcode-terminal');
const express = require('express');

const app = express();
app.use(express.json());

// WhatsApp Web Client Kurulumu
const client = new Client({
    authStrategy: new LocalAuth({
        dataPath: './session-data'
    }),
    puppeteer: {
        handleSIGINT: false,
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox',
            '--disable-dev-shm-usage',
            '--disable-accelerated-2d-canvas',
            '--no-first-run',
            '--no-zygote',
            '--disable-gpu'
        ]
    }
});

let isReady = false;

// QR Kod Üretildiğinde Terminalde Göster
client.on('qr', (qr) => {
    console.log('\n======================================================================');
    console.log('LÜTFEN TELEFONUNUZDAN WHATSAPP UYGULAMASINI AÇIN VE QR KODU TARATIN:');
    console.log('======================================================================\n');
    qrcode.generate(qr, { small: true });
});

// Giriş Başarılı Olduğunda
client.on('ready', () => {
    console.log('\n======================================================================');
    console.log('▶ WHATSAPP BOTU BAŞARIYLA BAĞLANDI VE AKTİF DURUMDA!');
    console.log('======================================================================\n');
    isReady = true;
});

client.on('auth_failure', (msg) => {
    console.error('WhatsApp Bağlantı Hatası: ', msg);
});

client.on('disconnected', (reason) => {
    console.log('WhatsApp Bağlantısı Kesildi: ', reason);
    isReady = false;
});

// WhatsApp Botunu Başlat
client.initialize();

// Numara Temizleme Yardımcı Fonksiyonu
function formatJID(number) {
    if (!number) return null;
    
    let cleanNumber = number.toString().replace(/[^0-9]/g, '');
    
    if (cleanNumber.length === 0) return null;
    
    if (cleanNumber.length === 10 && cleanNumber.startsWith('5')) {
        cleanNumber = '90' + cleanNumber;
    }
    
    if (cleanNumber.length < 10) {
        return null;
    }
    
    return `${cleanNumber}@c.us`;
}

// PHP'den OTP Gönderme İsteklerini Karşılayan API Endpoint'i
app.post('/send-otp', async (req, res) => {
    let { number, code, imagePath } = req.body;

    if (!isReady) {
        console.log(`❌ WhatsApp bağlı değil! Gönderilemeyen kod [${code}] -> No: ${number}`);
        return res.status(503).json({ success: false, message: 'WhatsApp botu henüz hazır değil.' });
    }

    if (!number || !code) {
        return res.status(400).json({ success: false, message: 'Eksik parametre.' });
    }

    try {
        const jid = formatJID(number);
        
        if (!jid) {
            console.log(`❌ Geçersiz numara formatı: ${number}`);
            return res.status(400).json({ success: false, message: 'Geçersiz telefon numarası formatı.' });
        }
        
        const messageText = `*Novara Hosting*\n\nDoğrulama kodunuz: *${code}*\n\nBu kod 3 dakika boyunca geçerlidir. Güvenliğiniz için kodunuzu kimseyle paylaşmayınız.`;

        // Logo varsa resimli gönder, yoksa sadece metin
        if (imagePath) {
            try {
                const fs = require('fs');
                if (fs.existsSync(imagePath)) {
                    const { MessageMedia } = require('whatsapp-web.js');
                    const media = MessageMedia.fromFilePath(imagePath);
                    await client.sendMessage(jid, media, { caption: messageText });
                    console.log(`✅ OTP Resimli Gönderildi: ${number} -> Kod: ${code}`);
                    return res.status(200).json({ success: true, message: 'OTP resimli olarak gönderildi.' });
                }
            } catch (imgErr) {
                console.error('OTP resim gönderim hatası, sadece metin gönderiliyor:', imgErr);
            }
        }

        await client.sendMessage(jid, messageText);
        console.log(`✅ OTP Mesajı Gönderildi: ${number} -> Kod: ${code}`);
        return res.status(200).json({ success: true, message: 'OTP başarıyla gönderildi.' });
    } catch (error) {
        console.error('OTP Gönderim Hatası:', error);
        return res.status(500).json({ success: false, message: 'Mesaj gönderilirken hata oluştu.' });
    }
});

// PHP'den Genel Mesaj Gönderme İsteklerini Karşılayan API Endpoint'i (Örn: Destek talebi yanıtı)
app.post('/send-message', async (req, res) => {
    let { number, message, imagePath } = req.body;

    if (!isReady) {
        console.log(`❌ WhatsApp bağlı değil! Gönderilemeyen mesaj -> No: ${number}`);
        return res.status(503).json({ success: false, message: 'WhatsApp botu henüz hazır değil.' });
    }

    if (!number || !message) {
        return res.status(400).json({ success: false, message: 'Eksik parametre.' });
    }

    try {
        const jid = formatJID(number);
        
        if (!jid) {
            console.log(`❌ Geçersiz numara formatı: ${number}`);
            return res.status(400).json({ success: false, message: 'Geçersiz telefon numarası formatı.' });
        }

        // Eğer resim yolu gönderildiyse, önce resmi gönder
        if (imagePath) {
            try {
                const fs = require('fs');
                const path = require('path');
                if (fs.existsSync(imagePath)) {
                    const { MessageMedia } = require('whatsapp-web.js');
                    const media = MessageMedia.fromFilePath(imagePath);
                    await client.sendMessage(jid, media, { caption: message });
                    console.log(`✅ Resimli Mesaj Gönderildi: ${number}`);
                    return res.status(200).json({ success: true, message: 'Resimli mesaj başarıyla gönderildi.' });
                }
            } catch(imgErr) {
                console.error('Resim gönderim hatası:', imgErr);
                // Resim gönderilemese de sadece metin gönder
            }
        }

        await client.sendMessage(jid, message);
        console.log(`✅ Mesaj Gönderildi: ${number} -> ${message.substring(0, 30)}...`);
        return res.status(200).json({ success: true, message: 'Mesaj başarıyla gönderildi.' });
    } catch (error) {
        console.error('Mesaj Gönderim Hatası:', error);
        return res.status(500).json({ success: false, message: 'Mesaj gönderilirken hata oluştu.' });
    }
});

// PHP'den Hoş Geldin Mesajı İsteklerini Karşılayan API Endpoint'i
app.post('/send-welcome', async (req, res) => {
    let { number, name, surname } = req.body;

    if (!isReady) {
        console.log(`❌ WhatsApp bağlı değil! Hoş geldin mesajı gönderilemedi -> No: ${number}`);
        return res.status(503).json({ success: false, message: 'WhatsApp botu henüz hazır değil.' });
    }

    try {
        const jid = formatJID(number);
        
        if (!jid) {
            console.log(`❌ Geçersiz numara formatı: ${number}`);
            return res.status(400).json({ success: false, message: 'Geçersiz telefon numarası formatı.' });
        }
        
        const fullName = `${name} ${surname}`;
        
        const messageText = `Merhaba *${fullName}*, aramıza hoş geldiniz! *Novara Hosting* olarak sizi burada görmekten gurur duyuyoruz. Bir sorunuz veya aklınıza takılan sorular olursa sitemiz üzerinden destek talebi açarak cevap alabilirsiniz. İyi günler dileriz.\n\n*Novara Hosting Ekibi*`;

        await client.sendMessage(jid, messageText);
        console.log(`✅ Hoş Geldin Mesajı Gönderildi: ${fullName} -> No: ${number}`);
        return res.json({ success: true, message: 'Hoş geldin mesajı gönderildi.' });
    } catch (error) {
        console.error('Hoş geldin mesajı gönderme hatası:', error);
        return res.status(500).json({ success: false, message: 'Mesaj gönderilemedi.', error: error.message });
    }
});

// PHP'den Giriş Bildirimi Gönderme İsteklerini Karşılayan API Endpoint'i
app.post('/send-login-alert', async (req, res) => {
    let { number, name, surname, ip, location } = req.body;

    if (!isReady) {
        console.log(`❌ WhatsApp bağlı değil! Giriş uyarısı gönderilemedi -> No: ${number}`);
        return res.status(503).json({ success: false, message: 'WhatsApp botu henüz hazır değil.' });
    }

    try {
        const jid = formatJID(number);
        
        if (!jid) {
            console.log(`❌ Geçersiz numara formatı: ${number}`);
            return res.status(400).json({ success: false, message: 'Geçersiz telefon numarası formatı.' });
        }
        
        const fullName = `${name} ${surname}`;
        
        const messageText = `Sayın *${fullName}*,\n\nHesabınıza yeni bir giriş yapıldı.\n\n🌐 *IP Adresi:* ${ip}\n📍 *Konum:* ${location || 'Bilinmiyor'}\n\nEğer bu giriş işlemi size ait değilse, lütfen vakit kaybetmeden *Novara Hosting* destek ekibiyle iletişime geçiniz.\n\nİyi günler dileriz.\n*Novara Hosting Ekibi*`;

        await client.sendMessage(jid, messageText);
        console.log(`✅ Giriş Bildirimi Gönderildi: ${fullName} -> No: ${number} (IP: ${ip}, Konum: ${location})`);
        return res.json({ success: true, message: 'Giriş bildirimi başarıyla gönderildi.' });
    } catch (error) {
        console.error('Giriş bildirimi gönderme hatası:', error);
        return res.status(500).json({ success: false, message: 'Bildirim gönderilemedi.', error: error.message });
    }
});

// PHP'den Şüpheli Kilitlenme Bildirimi Gönderme İsteklerini Karşılayan API Endpoint'i
app.post('/send-suspicious-alert', async (req, res) => {
    let { number, name, surname, ip, location } = req.body;

    if (!isReady) {
        console.log(`❌ WhatsApp bağlı değil! Şüpheli giriş uyarısı gönderilemedi -> No: ${number}`);
        return res.status(503).json({ success: false, message: 'WhatsApp botu henüz hazır değil.' });
    }

    try {
        const jid = formatJID(number);
        
        if (!jid) {
            console.log(`❌ Geçersiz numara formatı: ${number}`);
            return res.status(400).json({ success: false, message: 'Geçersiz telefon numarası formatı.' });
        }
        
        const fullName = `${name} ${surname}`;
        
        const messageText = `⚠️ *ŞÜPHELİ GİRİŞ DENEMESİ* ⚠️\n\nSayın *${fullName}*,\n\nHesabınıza üst üste hatalı kodlarla giriş yapılmaya çalışıldı ve hesabınız güvenlik amacıyla kilitlendi.\n\n🌐 *Giriş IP:* ${ip}\n📍 *Konum:* ${location || 'Bilinmiyor'}\n\nEğer bu denemeleri siz yapmadıysanız, hesabınızın güvenliği için *lütfen hemen şifrenizi değiştiriniz* ve destek ekibimizle iletişime geçiniz.\n\n*Novara Hosting Ekibi*`;

        await client.sendMessage(jid, messageText);
        console.log(`✅ Şüpheli Giriş Uyarısı Gönderildi: ${fullName} -> No: ${number} (IP: ${ip}, Konum: ${location})`);
        return res.json({ success: true, message: 'Şüpheli giriş bildirimi başarıyla gönderildi.' });
    } catch (error) {
        console.error('Şüpheli giriş bildirimi gönderme hatası:', error);
        return res.status(500).json({ success: false, message: 'Bildirim gönderilemedi.', error: error.message });
    }
});

// PHP'den Şifre Sıfırlama Bağlantısı Gönderme İsteklerini Karşılayan API Endpoint'i
app.post('/send-reset-link', async (req, res) => {
    let { number, name, surname, link } = req.body;

    if (!isReady) {
        console.log(`❌ WhatsApp bağlı değil! Şifre sıfırlama linki gönderilemedi -> No: ${number}`);
        return res.status(503).json({ success: false, message: 'WhatsApp botu henüz hazır değil.' });
    }

    try {
        const jid = formatJID(number);
        
        if (!jid) {
            console.log(`❌ Geçersiz numara formatı: ${number}`);
            return res.status(400).json({ success: false, message: 'Geçersiz telefon numarası formatı.' });
        }
        
        const fullName = `${name} ${surname}`;
        
        const messageText = `*Novara Hosting Şifre Sıfırlama*\n\nMerhaba Sayın *${fullName}*,\n\nHesabınız için şifre sıfırlama talebinde bulundunuz. Aşağıdaki bağlantıya tıklayarak yeni şifrenizi belirleyebilirsiniz:\n\n🔗 ${link}\n\nBu bağlantı 10 dakika boyunca geçerlidir. Şifre sıfırlama talebinde bulunmadıysanız bu mesajı dikkate almayınız.`;

        await client.sendMessage(jid, messageText);
        console.log(`✅ Şifre Sıfırlama Linki Gönderildi: ${fullName} -> No: ${number}`);
        return res.json({ success: true, message: 'Şifre sıfırlama bağlantısı gönderildi.' });
    } catch (error) {
        console.error('Şifre sıfırlama linki gönderme hatası:', error);
        return res.status(500).json({ success: false, message: 'Mesaj gönderilemedi.', error: error.message });
    }
});

const PORT = 3000;
app.listen(PORT, () => {
    console.log(`Bot sunucusu http://localhost:${PORT} portunda çalışıyor.`);
});
