// Import des données exportées de Postgres (voir export-postgres-data.ts)
// vers la nouvelle base MySQL (o2switch). À exécuter depuis la branche
// o2switch-migration (schéma MySQL), avec DATABASE_URL pointant vers la
// base MySQL cible. Les dates JSON (chaînes ISO) sont reconverties en Date.

import { db } from "@/lib/db"
import { readFileSync } from "fs"

const IN_PATH = process.env.EXPORT_PATH ?? "/tmp/valabel-export.json"

function reviveDates<T>(obj: T): T {
  return JSON.parse(JSON.stringify(obj), (_key, value) => {
    if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value)) {
      return new Date(value)
    }
    return value
  })
}

async function main() {
  const raw = JSON.parse(readFileSync(IN_PATH, "utf-8"))
  const data = reviveDates(raw)

  console.log("Import vers MySQL (o2switch)...")

  for (const u of data.users) await db.user.create({ data: u })
  for (const c of data.categories) await db.category.create({ data: c })
  for (const c of data.collaborators) await db.collaborator.create({ data: c })
  for (const d of data.drops) await db.drop.create({ data: d })
  for (const p of data.products) await db.product.create({ data: p })
  for (const o of data.orders) await db.order.create({ data: o })
  for (const oi of data.orderItems) await db.orderItem.create({ data: oi })
  for (const n of data.newsletter) await db.newsletter.create({ data: n })
  for (const s of data.settings) await db.setting.create({ data: s })

  const counts = await Promise.all([
    db.user.count(),
    db.category.count(),
    db.collaborator.count(),
    db.drop.count(),
    db.product.count(),
    db.order.count(),
    db.orderItem.count(),
    db.newsletter.count(),
    db.setting.count(),
  ])
  console.log(
    `Vérifié côté MySQL : ${counts[0]} users, ${counts[1]} categories, ${counts[2]} collaborators, ${counts[3]} drops, ${counts[4]} products, ${counts[5]} orders, ${counts[6]} orderItems, ${counts[7]} newsletter, ${counts[8]} settings`
  )
}

main()
  .catch((e) => {
    console.error(e)
    process.exit(1)
  })
  .finally(() => db.$disconnect())
