const { dbManager } = require('../database/index.cjs');
const path = require('path');
const fs = require('fs');

// 数据库初始化脚本
async function initializeDatabase() {
  try {
    console.log('🚀 开始初始化数据库...');
    
    // 初始化数据库连接和结构
    const db = dbManager.init();
    
    console.log('✅ 数据库结构创建成功');
    
    // 检查是否需要创建管理员用户
    const adminExists = db.prepare('SELECT id FROM users WHERE email = ?').get('admin@localhost');
    
    if (!adminExists) {
      const bcrypt = require('bcryptjs');
      const adminPassword = await bcrypt.hash('admin123', 12);
      
      // 创建管理员用户
      const insertAdmin = db.prepare(
        'INSERT INTO users (email, password_hash) VALUES (?, ?)'
      );
      const adminResult = insertAdmin.run('admin@localhost', adminPassword);
      
      // 创建管理员档案
      const insertAdminProfile = db.prepare(
        'INSERT INTO user_profiles (user_id, full_name, username) VALUES (?, ?, ?)'
      );
      insertAdminProfile.run(adminResult.lastInsertRowid, '系统管理员', 'admin');
      
      console.log('✅ 管理员用户创建成功');
      console.log('   邮箱: admin@localhost');
      console.log('   密码: admin123');
    } else {
      console.log('ℹ️  管理员用户已存在');
    }
    
    // 创建示例数据（可选）
    await createSampleData(db);
    
    console.log('🎉 数据库初始化完成！');
    console.log(`📍 数据库文件位置: ${path.resolve('./numerology.db')}`);
    
  } catch (error) {
    console.error('❌ 数据库初始化失败:', error);
    process.exit(1);
  } finally {
    dbManager.close();
  }
}

// 创建示例数据
async function createSampleData(db) {
  try {
    // 检查是否已有示例数据
    const existingReadings = db.prepare('SELECT COUNT(*) as count FROM numerology_readings').get();
    
    if (existingReadings.count > 0) {
      console.log('ℹ️  示例数据已存在，跳过创建');
      return;
    }
    
    // 创建示例用户
    const bcrypt = require('bcryptjs');
    const testPassword = await bcrypt.hash('test123', 12);
    
    const insertTestUser = db.prepare(
      'INSERT INTO users (email, password_hash) VALUES (?, ?)'
    );
    const testUserResult = insertTestUser.run('test@example.com', testPassword);
    const testUserId = testUserResult.lastInsertRowid;
    
    // 创建测试用户档案
    const insertTestProfile = db.prepare(
      'INSERT INTO user_profiles (user_id, full_name, birth_date, gender) VALUES (?, ?, ?, ?)'
    );
    insertTestProfile.run(testUserId, '测试用户', '1990-01-01', 'male');
    
    // 创建示例分析记录
    const sampleAnalysis = {
      analysis_type: 'bazi',
      analysis_date: new Date().toISOString().split('T')[0],
      basic_info: {
        personal_data: {
          name: '测试用户',
          birth_date: '1990-01-01',
          birth_time: '12:00',
          gender: '男性'
        }
      },
      wuxing_analysis: {
        element_distribution: { '木': 2, '火': 1, '土': 2, '金': 2, '水': 1 },
        balance_analysis: '五行分布较为均匀，整体平衡良好',
        personal_traits: '性格温和平衡，具有良好的适应能力',
        suggestions: '建议保持现有的平衡状态，继续稳步发展'
      }
    };
    
    const insertSampleReading = db.prepare(`
      INSERT INTO numerology_readings (
        user_id, reading_type, name, birth_date, birth_time, gender,
        input_data, analysis, status
      ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
    `);
    
    insertSampleReading.run(
      testUserId,
      'bazi',
      '测试用户',
      '1990-01-01',
      '12:00',
      'male',
      JSON.stringify({ name: '测试用户', birth_date: '1990-01-01', birth_time: '12:00', gender: 'male' }),
      JSON.stringify(sampleAnalysis),
      'completed'
    );
    
    console.log('✅ 示例数据创建成功');
    console.log('   测试用户邮箱: test@example.com');
    console.log('   测试用户密码: test123');
    
  } catch (error) {
    console.error('创建示例数据失败:', error);
    // 不抛出错误，允许继续初始化
  }
}

// 数据库备份功能
function backupDatabase() {
  try {
    const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
    const backupPath = path.join(__dirname, `../../backups/numerology_${timestamp}.db`);
    
    // 确保备份目录存在
    const backupDir = path.dirname(backupPath);
    if (!fs.existsSync(backupDir)) {
      fs.mkdirSync(backupDir, { recursive: true });
    }
    
    dbManager.backup(backupPath);
    console.log(`✅ 数据库备份成功: ${backupPath}`);
    
  } catch (error) {
    console.error('❌ 数据库备份失败:', error);
  }
}

// 数据库清理功能
function cleanupDatabase() {
  try {
    const db = dbManager.getDatabase();
    
    // 清理过期会话
    const cleanupSessions = db.prepare('DELETE FROM user_sessions WHERE expires_at < ?');
    const sessionResult = cleanupSessions.run(new Date().toISOString());
    
    console.log(`✅ 清理了 ${sessionResult.changes} 个过期会话`);
    
    // 可以添加更多清理逻辑
    // 例如：清理超过一年的分析记录等
    
  } catch (error) {
    console.error('❌ 数据库清理失败:', error);
  }
}

// 命令行参数处理
const args = process.argv.slice(2);
const command = args[0];

switch (command) {
  case 'backup':
    backupDatabase();
    break;
  case 'cleanup':
    cleanupDatabase();
    break;
  case 'init':
  default:
    initializeDatabase();
    break;
}

// 如果直接运行此脚本
if (require.main === module) {
  // 脚本被直接执行
}

module.exports = {
  initializeDatabase,
  backupDatabase,
  cleanupDatabase
};