/**
 * Copyright (c) 2024-2026 Тарабанов Александр Викторович
 * All rights reserved.
 * 
 * This software is proprietary and confidential.
 * Unauthorized copying, modification, or distribution is prohibited.
 * 
 * For licensing inquiries: info@hb3-accelerator.com
 * Website: https://hb3-accelerator.com
 * GitHub: https://github.com/VC-HB3-Accelerator
 */

const fs = require('fs');
const path = require('path');
const { pool } = require('./index');
const logger = require('../utils/logger');

// Инициализация таблицы roles
async function initRoles() {
  try {
    // Проверяем, существует ли таблица roles
    const tableExists = await pool.query(`
      SELECT EXISTS (
        SELECT FROM information_schema.tables 
        WHERE table_name = 'roles'
      );
    `);

    if (!tableExists.rows[0].exists) {
      // Создаем таблицу roles
      await pool.query(`
        CREATE TABLE roles (
          id SERIAL PRIMARY KEY,
          name VARCHAR(50) NOT NULL UNIQUE,
          description TEXT,
          created_at TIMESTAMP NOT NULL DEFAULT NOW()
        );
      `);

      // Добавляем роли
      await pool.query(`
        INSERT INTO roles (id, name, description) VALUES 
        (3, 'user', 'Обычный пользователь'),
        (4, 'editor', 'Администратор с полным доступом');
      `);

      // console.log('Таблица roles создана и заполнена');
    } else {
      // Проверяем наличие ролей
      const rolesExist = await pool.query(`
        SELECT COUNT(*) FROM roles WHERE id IN (3, 4);
      `);

      if (rolesExist.rows[0].count < 2) {
        // Добавляем недостающие роли
        const userRoleExists = await pool.query(
          `SELECT EXISTS (SELECT FROM roles WHERE name = 'user');`
        );
        const adminRoleExists = await pool.query(
          `SELECT EXISTS (SELECT FROM roles WHERE name = 'editor');`
        );

        if (!userRoleExists.rows[0].exists) {
          await pool.query(`
            INSERT INTO roles (id, name, description) VALUES 
            (3, 'user', 'Обычный пользователь');
          `);
        }

        if (!adminRoleExists.rows[0].exists) {
          await pool.query(`
            INSERT INTO roles (id, name, description) VALUES 
            (4, 'editor', 'Администратор с полным доступом');
          `);
        }

        // console.log('Таблица roles обновлена');
      }
    }
  } catch (error) {
    // console.error('Ошибка при инициализации таблицы roles:', error);
    throw error;
  }
}

async function initializeDatabase() {
  try {
    // Создаем таблицу для отслеживания миграций, если её нет
    await pool.query(`
      CREATE TABLE IF NOT EXISTS migrations (
        id SERIAL PRIMARY KEY,
        name VARCHAR(255) NOT NULL UNIQUE,
        executed_at TIMESTAMP NOT NULL DEFAULT NOW()
      );
    `);

    // Путь к папке с миграциями
    const migrationsPath = path.join(__dirname, 'migrations');

    // Получаем все файлы миграций
    const migrationFiles = fs
      .readdirSync(migrationsPath)
      .filter((file) => file.endsWith('.sql'))
      .sort();

    // Получаем выполненные миграции
    const { rows } = await pool.query('SELECT name FROM migrations');
    const executedMigrations = new Set(rows.map((row) => row.name));

    // Выполняем только новые миграции
    for (const file of migrationFiles) {
      if (!executedMigrations.has(file)) {
        const filePath = path.join(migrationsPath, file);
        const sql = fs.readFileSync(filePath, 'utf8');

        await pool.query(sql);

        // Записываем выполненную миграцию
        await pool.query('INSERT INTO migrations (name) VALUES ($1)', [file]);

      }
    }

  } catch (error) {
    logger.error('Error during database initialization:', error);
    throw error;
  }
}

const initDb = async () => {
  await createTables();
  // await initRoles(); // Вызов тоже удаляем
};

module.exports = initDb;
