/**
 * Unit Tests für TelegramNotificationService
 * 
 * Phase 2: Basic Service Tests
 */

const TelegramNotificationService = require('../../src/services/TelegramNotificationService');

// Mock node-telegram-bot-api komplett
jest.mock('node-telegram-bot-api');

describe('TelegramNotificationService', () => {
    let originalEnv;
    let TelegramBot;
    let mockBotInstance;

    beforeAll(() => {
        TelegramBot = require('node-telegram-bot-api');
    });

    beforeEach(() => {
        // Speichere originale ENV-Variablen
        originalEnv = { ...process.env };

        // Setze Test-ENV
        process.env.TELEGRAM_ENABLED = 'true';
        process.env.TELEGRAM_BOT_TOKEN = 'test-bot-token-123';
        process.env.TELEGRAM_CHAT_ID = '-1001234567890';

        // Erstelle Mock-Bot-Instanz
        mockBotInstance = {
            sendMessage: jest.fn().mockResolvedValue({
                message_id: 42,
                chat: { id: -1001234567890 },
                text: 'Test'
            }),
            getMe: jest.fn().mockResolvedValue({
                id: 123456,
                first_name: 'Test Bot',
                username: 'test_bot'
            })
        };

        // Mock TelegramBot constructor
        TelegramBot.mockImplementation(() => mockBotInstance);
    });

    afterEach(() => {
        // Restore original ENV
        process.env = originalEnv;
    });

    describe('Initialization', () => {
        it('sollte erfolgreich initialisieren wenn TELEGRAM_ENABLED=true', () => {
            const service = new TelegramNotificationService();
            
            expect(service.isAvailable()).toBe(true);
            expect(TelegramBot).toHaveBeenCalledWith('test-bot-token-123', { polling: false });
        });

        it('sollte nicht initialisieren wenn TELEGRAM_ENABLED=false', () => {
            process.env.TELEGRAM_ENABLED = 'false';
            
            const service = new TelegramNotificationService();
            
            expect(service.isAvailable()).toBe(false);
        });

        it('sollte fehlschlagen wenn TELEGRAM_BOT_TOKEN fehlt', () => {
            delete process.env.TELEGRAM_BOT_TOKEN;
            
            const service = new TelegramNotificationService();
            
            expect(service.isAvailable()).toBe(false);
        });

        it('sollte fehlschlagen wenn TELEGRAM_CHAT_ID fehlt', () => {
            delete process.env.TELEGRAM_CHAT_ID;
            
            const service = new TelegramNotificationService();
            
            expect(service.isAvailable()).toBe(false);
        });
    });

    describe('sendTestMessage', () => {
        it('sollte Test-Nachricht erfolgreich senden', async () => {
            const service = new TelegramNotificationService();
            
            const result = await service.sendTestMessage();
            
            expect(result).toBeDefined();
            expect(result.message_id).toBe(42);
            expect(mockBotInstance.sendMessage).toHaveBeenCalledWith(
                '-1001234567890',
                expect.stringContaining('Telegram Service Test')
            );
        });

        it('sollte null zurückgeben wenn Service nicht verfügbar', async () => {
            process.env.TELEGRAM_ENABLED = 'false';
            
            const service = new TelegramNotificationService();
            
            const result = await service.sendTestMessage();
            
            expect(result).toBeNull();
        });

        it('sollte Fehler werfen bei Telegram-API-Fehler', async () => {
            const service = new TelegramNotificationService();
            
            mockBotInstance.sendMessage.mockRejectedValueOnce(new Error('API Error'));
            
            await expect(service.sendTestMessage()).rejects.toThrow('API Error');
        });
    });

    describe('formatSocialMediaIcons', () => {
        it('sollte Social Media Plattformen korrekt formatieren', () => {
            const service = new TelegramNotificationService();
            
            const result = service.formatSocialMediaIcons(['facebook', 'instagram', 'tiktok']);
            
            expect(result).toBe('📘 Facebook, 📷 Instagram, 🎵 TikTok');
        });

        it('sollte leeren String bei leerer Liste zurückgeben', () => {
            const service = new TelegramNotificationService();
            
            const result = service.formatSocialMediaIcons([]);
            
            expect(result).toBe('');
        });

        it('sollte case-insensitive sein', () => {
            const service = new TelegramNotificationService();
            
            const result = service.formatSocialMediaIcons(['FACEBOOK', 'Instagram', 'TikTok']);
            
            expect(result).toBe('📘 Facebook, 📷 Instagram, 🎵 TikTok');
        });
    });

    describe('getAdminUrl', () => {
        it('sollte Admin-URL mit PUBLIC_URL generieren', () => {
            process.env.PUBLIC_URL = 'https://test.example.com';
            
            const service = new TelegramNotificationService();
            
            const url = service.getAdminUrl();
            
            expect(url).toBe('https://test.example.com/moderation');
        });

        it('sollte Default-URL verwenden wenn PUBLIC_URL nicht gesetzt', () => {
            delete process.env.PUBLIC_URL;
            
            const service = new TelegramNotificationService();
            
            const url = service.getAdminUrl();
            
            expect(url).toBe('https://internal.hobbyhimmel.de/moderation');
        });
    });

    describe('sendUploadNotification (Phase 3)', () => {
        it('sollte Upload-Benachrichtigung mit korrekten Daten senden', async () => {
            const service = new TelegramNotificationService();
            
            const groupData = {
                name: 'Max Mustermann',
                year: 2024,
                title: 'Schweißkurs November',
                imageCount: 12,
                workshopConsent: true,
                socialMediaConsents: ['instagram', 'tiktok'],
                token: 'test-token-123'
            };
            
            await service.sendUploadNotification(groupData);
            
            expect(mockBotInstance.sendMessage).toHaveBeenCalledWith(
                '-1001234567890',
                expect.stringContaining('📸 Neuer Upload!')
            );
            expect(mockBotInstance.sendMessage).toHaveBeenCalledWith(
                '-1001234567890',
                expect.stringContaining('Max Mustermann')
            );
            expect(mockBotInstance.sendMessage).toHaveBeenCalledWith(
                '-1001234567890',
                expect.stringContaining('Bilder: 12')
            );
        });

        it('sollte null zurückgeben und nicht werfen bei Fehler', async () => {
            const service = new TelegramNotificationService();
            
            mockBotInstance.sendMessage.mockRejectedValueOnce(new Error('Network error'));
            
            const groupData = {
                name: 'Test User',
                year: 2024,
                title: 'Test',
                imageCount: 5,
                workshopConsent: false,
                socialMediaConsents: []
            };
            
            const result = await service.sendUploadNotification(groupData);
            
            expect(result).toBeNull();
        });
    });
});
