const { Client } = require('pg');
require('dotenv').config();

async function initializeDatabase() {
    console.log('🔄 Инициализация PostgreSQL...');
    
    // Сначала подключаемся без конкретной БД
    const adminClient = new Client({
        host: process.env.DB_HOST,
        port: process.env.DB_PORT || 5432,
        user: process.env.DB_USER,
        password: process.env.DB_PASSWORD,
        database: 'postgres' // Подключаемся к системной БД
    });

    try {
        await adminClient.connect();
        console.log('✅ Подключение к PostgreSQL установлено');

        // Проверяем существование базы данных
        const dbCheck = await adminClient.query(`
            SELECT 1 FROM pg_database WHERE datname = '${process.env.DB_NAME}'
        `);

        if (dbCheck.rows.length === 0) {
            console.log(`📦 База данных ${process.env.DB_NAME} не существует, создаем...`);
            await adminClient.query(`CREATE DATABASE ${process.env.DB_NAME}`);
            console.log(`✅ База данных ${process.env.DB_NAME} создана`);
        } else {
            console.log(`✅ База данных ${process.env.DB_NAME} уже существует`);
        }

        await adminClient.end();

        // Теперь подключаемся к созданной БД
        const dbClient = new Client({
            host: process.env.DB_HOST,
            port: process.env.DB_PORT || 5432,
            user: process.env.DB_USER,
            password: process.env.DB_PASSWORD,
            database: process.env.DB_NAME
        });

        await dbClient.connect();
        
        // Создаем таблицы
        await dbClient.query(`
            CREATE TABLE IF NOT EXISTS sms_logs (
                id SERIAL PRIMARY KEY,
                task_id INTEGER NOT NULL,
                task_title VARCHAR(500) NOT NULL,
                task_description TEXT,
                notification_type VARCHAR(50) NOT NULL,
                creator_id INTEGER,
                creator_name VARCHAR(255),
                creator_login VARCHAR(100),
                assignee_id INTEGER,
                assignee_name VARCHAR(255),
                assignee_login VARCHAR(100),
                message_content TEXT NOT NULL,
                message_subject VARCHAR(500),
                delivery_methods JSONB DEFAULT '[]',
                status VARCHAR(50) DEFAULT 'pending',
                error_message TEXT,
                retry_count INTEGER DEFAULT 0,
                sent_at TIMESTAMP,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                comments TEXT
            )
        `);

        // Создаем индексы
        const indexes = [
            'CREATE INDEX IF NOT EXISTS idx_sms_logs_task_id ON sms_logs(task_id)',
            'CREATE INDEX IF NOT EXISTS idx_sms_logs_creator_id ON sms_logs(creator_id)',
            'CREATE INDEX IF NOT EXISTS idx_sms_logs_assignee_id ON sms_logs(assignee_id)',
            'CREATE INDEX IF NOT EXISTS idx_sms_logs_status ON sms_logs(status)',
            'CREATE INDEX IF NOT EXISTS idx_sms_logs_created_at ON sms_logs(created_at)'
        ];

        for (const indexQuery of indexes) {
            try {
                await dbClient.query(indexQuery);
            } catch (err) {
                console.warn(`⚠️ Индекс не создан: ${err.message}`);
            }
        }

        await dbClient.end();
        console.log('✅ PostgreSQL полностью инициализирован');
        return true;
        
    } catch (error) {
        console.error('❌ Ошибка инициализации PostgreSQL:', error.message);
        return false;
    }
}

module.exports = { initializeDatabase };