import type { AppDatabase } from './init.js'
import { sqlAll, sqlOne } from './helpers.js'
import bcrypt from 'bcryptjs'
import { calcularCostePorUnidad } from '../services/coste.js'

interface GastoSeed {
  nombre: string
  importe_compra: number
  cantidad_lote: number
  unidad_medida: string
  descripcion?: string
}

const GASTOS_SEED: GastoSeed[] = [
  { nombre: 'Cemento', importe_compra: 49, cantidad_lote: 10, unidad_medida: 'kg' },
  { nombre: 'Pigmento-Liquido', importe_compra: 16, cantidad_lote: 50, unidad_medida: 'ml' },
  { nombre: 'Barniz', importe_compra: 14, cantidad_lote: 50, unidad_medida: 'ml' },
  { nombre: 'Decoracion-Piedra dorada', importe_compra: 10, cantidad_lote: 100, unidad_medida: 'gr' },
  { nombre: 'Pigmento-Dorado', importe_compra: 15, cantidad_lote: 50, unidad_medida: 'ml' },
  { nombre: 'Pigmento-Polvo', importe_compra: 13, cantidad_lote: 50, unidad_medida: 'ml' },
  { nombre: 'Cera-Soja-bajo punto fusion', importe_compra: 48, cantidad_lote: 5, unidad_medida: 'kg' },
  { nombre: 'Colorante liquido-Velas', importe_compra: 4, cantidad_lote: 30, unidad_medida: 'ml' },
  { nombre: 'Pabilos', importe_compra: 10, cantidad_lote: 100, unidad_medida: 'ud' },
  { nombre: 'Cera-Soja-Alto punto fusion', importe_compra: 40, cantidad_lote: 5, unidad_medida: 'kg' },
  { nombre: 'Esencias aceite madera MAYJAM', importe_compra: 10, cantidad_lote: 100, unidad_medida: 'ml' },
  { nombre: 'Esencias aceite madera VAINILLA', importe_compra: 9, cantidad_lote: 100, unidad_medida: 'ml' },
  { nombre: 'Esencias aceite madera Naranja Dulce', importe_compra: 10, cantidad_lote: 100, unidad_medida: 'ml' },
  { nombre: 'Esencias aceite madera MAYJAM cedro', importe_compra: 10, cantidad_lote: 100, unidad_medida: 'ml' },
  { nombre: 'Esencias aceite madera MAYJAM canela', importe_compra: 10, cantidad_lote: 100, unidad_medida: 'ml' },
  { nombre: 'Vaso Cristal-12oz', importe_compra: 43, cantidad_lote: 12, unidad_medida: 'ud' },
  { nombre: 'Vaso Con Tapa negra 24oz', importe_compra: 36, cantidad_lote: 6, unidad_medida: 'ud' },
  { nombre: 'Tinte para velas 32 colors', importe_compra: 16, cantidad_lote: 32, unidad_medida: 'col' },
  { nombre: 'Etiquetas transparente redonda', importe_compra: 17, cantidad_lote: 300, unidad_medida: 'ud' },
  { nombre: 'Mechas maderas -13 cm', importe_compra: 7, cantidad_lote: 30, unidad_medida: 'ud' },
  { nombre: 'Caja 310x215x100 mm marron', importe_compra: 56, cantidad_lote: 50, unidad_medida: 'ud' },
  { nombre: 'vaso 4oz', importe_compra: 40, cantidad_lote: 20, unidad_medida: 'ud' },
]

export function seedDatabase(db: AppDatabase): void {
  const usuarioExiste = sqlOne<{ total: number }>(
    db.prepare('SELECT COUNT(*) as total FROM usuarios').get(),
  )

  if (!usuarioExiste || usuarioExiste.total === 0) {
    const hash = bcrypt.hashSync('zx.13g-PQfg', 10)
    db.prepare(
      'INSERT INTO usuarios (nombre_usuario, contrasena_hash) VALUES (?, ?)',
    ).run('nuria', hash)
  }

  const gastosExistentes = sqlOne<{ total: number }>(
    db.prepare('SELECT COUNT(*) as total FROM gastos').get(),
  )

  if (!gastosExistentes || gastosExistentes.total === 0) {
    const insertGasto = db.prepare(`
      INSERT INTO gastos (nombre, importe_compra, cantidad_lote, unidad_medida, coste_por_unidad, descripcion)
      VALUES (?, ?, ?, ?, ?, ?)
    `)

    for (const gasto of GASTOS_SEED) {
      const coste = calcularCostePorUnidad(gasto.importe_compra, gasto.cantidad_lote)
      insertGasto.run(
        gasto.nombre,
        gasto.importe_compra,
        gasto.cantidad_lote,
        gasto.unidad_medida,
        coste,
        gasto.descripcion ?? null,
      )
    }
  }

  const articulosExistentes = sqlOne<{ total: number }>(
    db.prepare('SELECT COUNT(*) as total FROM articulos').get(),
  )

  if (!articulosExistentes || articulosExistentes.total === 0) {
    const insertArticulo = db.prepare(`
      INSERT INTO articulos (titulo, descripcion, importe, coste_total)
      VALUES (?, ?, ?, ?)
    `)
    const resultado = insertArticulo.run(
      'Vaso cristal tapa con flor',
      'Vela artesanal en vaso de cristal con tapa decorativa',
      null,
      14.65,
    )
    const articuloId = Number(resultado.lastInsertRowid)

    const gastos = sqlAll<{ id: number; nombre: string }>(
      db.prepare('SELECT id, nombre FROM gastos').all(),
    )

    const buscarGasto = (nombre: string) =>
      gastos.find((g) => g.nombre.toLowerCase() === nombre.toLowerCase())

    const lineas = [
      { gasto: 'vaso 4oz', cantidad: 1, unidad: 'ud', coste: 0.5, notas: 'vaso 4ozx1', manual: 1 },
      { gasto: 'Cera-Soja-bajo punto fusion', cantidad: 103, unidad: 'g', coste: 5, notas: '103 gm cera bajo punto fusion', manual: 1 },
      { gasto: 'Tinte para velas 32 colors', cantidad: 1, unidad: 'col', coste: 1, notas: 'colorante (tinte para velas 32)', manual: 1 },
      { gasto: 'Etiquetas transparente redonda', cantidad: 1, unidad: 'ud', coste: 0.05, notas: 'etiqueta transparente x1', manual: 1 },
      { gasto: 'Esencias aceite madera MAYJAM', cantidad: 1, unidad: 'ml', coste: 3, notas: 'aroma (MAYJAM) x (ml)', manual: 1 },
      { gasto: 'Pabilos', cantidad: 1, unidad: 'ud', coste: 0.1, notas: '1xPabilo', manual: 0 },
      { gasto: null, cantidad: 0, unidad: 'ud', coste: 3.5, notas: 'Decoracion(margarita)', manual: 1 },
      { gasto: null, cantidad: 0, unidad: 'ud', coste: 1.5, notas: 'Decoracion (bolsa)', manual: 1 },
    ]

    const insertLinea = db.prepare(`
      INSERT INTO articulo_gastos (articulo_id, gasto_id, cantidad_usada, unidad_usada, coste_linea, es_manual, notas)
      VALUES (?, ?, ?, ?, ?, ?, ?)
    `)

    for (const linea of lineas) {
      const gastoId = linea.gasto ? buscarGasto(linea.gasto)?.id ?? null : null
      if (linea.gasto && !gastoId) continue

      insertLinea.run(
        articuloId,
        gastoId,
        linea.cantidad,
        linea.unidad,
        linea.coste,
        linea.manual,
        linea.notas,
      )
    }
  }
}
