import { PrismaClient } from '@prisma/client'
import bcrypt from 'bcryptjs'

const prisma = new PrismaClient()

// Список базовых категорий товаров
const DEFAULT_CATEGORIES = [
  'Одежда и обувь',
  'Косметика и парфюмерия',
  'Дом и сад',
  'Детские товары',
  'Спорт и отдых',
  'Электроника',
  'Книги',
  'Здоровье',
  'Автотовары',
  'Строительство и ремонт',
  'Продукты питания',
  'Зоотовары',
  'Дача, сад и огород',
  'Канцелярские товары',
  'Хобби и творчество',
  'Украшения и аксессуары',
  'Сумки и чемоданы',
  'Техника для дома',
  'Музыкальные инструменты',
  'Игры и игрушки',
]

let isInitialized = false

export async function ensureAdmin() {
  try {
    // Проверяем есть ли уже админ
    const existingAdmin = await prisma.admin.findUnique({
      where: { username: 'admin' },
    })

    if (existingAdmin) {
      return existingAdmin
    }

    console.warn('🔐 Создание администратора...')

    // Генерируем хеш пароля
    const password = 'admin123' // Временный пароль
    const hashedPassword = await bcrypt.hash(password, 12)

    // Создаем администратора
    const admin = await prisma.admin.create({
      data: {
        username: 'admin',
        password: hashedPassword,
        email: 'admin@sferav.com',
        isActive: true,
      },
    })

    console.warn('✅ Администратор создан:', admin.username)
    return admin
  } catch (error) {
    console.error('❌ Ошибка создания администратора:', error)
    return null
  }
}

export async function ensureCategories() {
  try {
    // Проверяем сколько категорий уже есть
    const existingCount = await prisma.category.count()

    if (existingCount >= DEFAULT_CATEGORIES.length) {
      return { created: 0, existing: existingCount }
    }

    let createdCount = 0

    for (const categoryName of DEFAULT_CATEGORIES) {
      try {
        // Проверяем существует ли категория
        const existingCategory = await prisma.category.findUnique({
          where: { name: categoryName },
        })

        if (!existingCategory) {
          // Создаем категорию
          await prisma.category.create({
            data: { name: categoryName },
          })
          createdCount++
        }
      } catch (error: any) {
        // Игнорируем ошибки дублирования
        if (error.code !== 'P2002') {
          console.error(`Ошибка создания категории "${categoryName}":`, error.message)
        }
      }
    }

    if (createdCount > 0) {
      console.warn(`📂 Создано категорий: ${createdCount}`)
    }

    return { created: createdCount, existing: existingCount }
  } catch (error) {
    console.error('❌ Ошибка создания категорий:', error)
    return { created: 0, existing: 0 }
  }
}

export async function initializeDatabase() {
  if (isInitialized) {
    return
  }

  try {
    console.warn('🚀 Проверка инициализации базы данных...')

    // Инициализируем админа и категории параллельно
    const [admin, categories] = await Promise.all([ensureAdmin(), ensureCategories()])

    isInitialized = true

    if (admin || categories.created > 0) {
      console.warn('✨ Инициализация базы данных завершена')
    }

    return { admin, categories }
  } catch (error) {
    console.error('💥 Ошибка инициализации базы данных:', error)
    return null
  }
}

// Автоматическая инициализация при импорте модуля
if (typeof window === 'undefined') {
  // Только на сервере
  initializeDatabase().catch(console.error)
}
