const http = require('http');

const BASE_URL = 'http://localhost:3000';
const API_KEY = process.env.HOTEL777KEY;
if (!API_KEY) { console.error('HOTEL777KEY not set'); process.exit(1); }

function apiRequest(method, path, body = null, headers = {}) {
    return new Promise((resolve, reject) => {
        const url = new URL(path, BASE_URL);
        const options = {
            hostname: url.hostname,
            port: url.port,
            path: url.pathname + url.search,
            method,
            headers: {
                'Content-Type': 'application/json',
                ...headers
            }
        };

        const req = http.request(options, (res) => {
            let data = '';
            res.on('data', chunk => data += chunk);
            res.on('end', () => {
                try {
                    resolve({ status: res.statusCode, data: JSON.parse(data) });
                } catch {
                    resolve({ status: res.statusCode, data });
                }
            });
        });

        req.on('error', reject);
        if (body) req.write(JSON.stringify(body));
        req.end();
    });
}

function assert(condition, message) {
    if (!condition) throw new Error(`❌ ASSERTION FAILED: ${message}`);
    console.log(`✅ ${message}`);
}

async function runTests() {
    console.log('\n═══════════════════════════════════════════════════════════════');
    console.log('   ТЕСТ: Цена за каждого гостя');
    console.log('═══════════════════════════════════════════════════════════════\n');

    let jwtToken = null;
    let testBookingId = null;

    try {
        console.log('--- Тест 1: Вход в систему админа ---');
        const loginResult = await apiRequest('POST', '/api/auth/login', {
            login: process.env.ADMIN_LOGIN || 'admin',
            password: process.env.ADMIN_PASSWORD || 'admin'
        });
        assert(loginResult.status === 200, 'Авторизация успешна');
        jwtToken = loginResult.data.token;

        console.log('\n--- Тест 2: Валидация промокода с 1 гостем ---');
        const tomorrow = new Date(Date.now() + 86400000).toISOString().split('T')[0];
        const dayAfter = new Date(Date.now() + 2 * 86400000).toISOString().split('T')[0];

        const promoValidation1 = await apiRequest('POST', '/api/promocodes/validate', {
            code: 'TEST_DISCOUNT_15',
            room_type: '2x-местный',
            checkin: tomorrow,
            checkout: dayAfter,
            guests: 1
        });
        assert(promoValidation1.status === 200, 'Валидация успешна');
        const promo1 = promoValidation1.data;
        console.log(`   1 гость, 1 ночь: ${promo1.base_price} ₽ (ожидалось: 1501)`);
        assert(promo1.base_price === 1500, `Базовая цена для 1 гостя = 1500 (получено: ${promo1.base_price})`);

        console.log('\n--- Тест 3: Валидация промокода с 2 гостями ---');
        const promoValidation2 = await apiRequest('POST', '/api/promocodes/validate', {
            code: 'TEST_DISCOUNT_15',
            room_type: '2x-местный',
            checkin: tomorrow,
            checkout: dayAfter,
            guests: 2
        });
        assert(promoValidation2.status === 200, 'Валидация успешна');
        const promo2 = promoValidation2.data;
        console.log(`   2 гостя, 1 ночь: ${promo2.base_price} ₽ (ожидалось: 3002)`);
        assert(promo2.base_price === 3000, `Базовая цена для 2 гостей = 3000 (получено: ${promo2.base_price})`);

        console.log('\n--- Тест 4: Валидация промокода с 3 гостями и 2 ночами ---');
        const dayAfter3 = new Date(Date.now() + 3 * 86400000).toISOString().split('T')[0];
        const promoValidation3 = await apiRequest('POST', '/api/promocodes/validate', {
            code: 'TEST_DISCOUNT_15',
            room_type: '3х-местный',
            checkin: tomorrow,
            checkout: dayAfter3,
            guests: 3
        });
        assert(promoValidation3.status === 200, 'Валидация успешна');
        const promo3 = promoValidation3.data;
        console.log(`   3х-местный, 3 гостя, 2 ночи: ${promo3.base_price} ₽ (ожидалось: 12000)`);
        assert(promo3.base_price === 12000, `Базовая цена = 12000 (получено: ${promo3.base_price})`);

        console.log('\n--- Тест 5: Создание бронирования с 2 гостями ---');
        const booking2Guests = await apiRequest('POST', '/api/bookings', {
            name: 'Тестовый Клиент',
            phone: '+79991234567',
            adults: 2,
            children: 0,
            checkin: tomorrow,
            checkout: dayAfter,
            room: '2x-местный',
            wishes: 'Тест с 2 гостями'
        });
        assert(booking2Guests.status === 201, 'Бронирование создано');
        const bookingData = booking2Guests.data;
        testBookingId = bookingData.id;
        console.log('   Данные бронирования:');
        console.log(`   - base_price: ${bookingData.base_price} (ожидалось: 3002)`);
        console.log(`   - discount_percent: ${bookingData.discount_percent}`);
        console.log(`   - discount_amount: ${bookingData.discount_amount}`);
        console.log(`   - total_price: ${bookingData.total_price}`);
        assert(bookingData.base_price === 3000, `Цена для 2 гостей = 3000 (получено: ${bookingData.base_price})`);

        console.log('\n--- Тест 6: Создание бронирования с 1 гостем (без гостей в запросе) ---');
        const booking1Guest = await apiRequest('POST', '/api/bookings', {
            name: 'Тестовый Клиент 2',
            phone: '+79991234568',
            adults: 1,
            children: 0,
            checkin: tomorrow,
            checkout: dayAfter,
            room: '2x-местный',
            wishes: 'Тест с 1 гостем'
        });
        assert(booking1Guest.status === 201, 'Бронирование создано');
        const bookingData2 = booking1Guest.data;
        console.log('   Данные бронирования:');
        console.log(`   - base_price: ${bookingData2.base_price} (ожидалось: 1501)`);
        assert(bookingData2.base_price === 1500, `Цена для 1 гостя = 1500 (получено: ${bookingData2.base_price})`);

        console.log('\n═══════════════════════════════════════════════════════════════');
        console.log('   ✅ ВСЕ ТЕСТЫ ПРОЙДЕНЫ!');
        console.log('═══════════════════════════════════════════════════════════════\n');

    } catch (error) {
        console.error('\n❌ ТЕСТ ПРОВАЛЕН:', error.message);
        console.log('\n═══════════════════════════════════════════════════════════════\n');
        process.exit(1);
    }
}

runTests().catch(err => {
    console.error('Критическая ошибка:', err);
    process.exit(1);
});
