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

const prisma = new PrismaClient()

const DEMO_PASSWORD_HASH = bcrypt.hashSync('demo1234', 10)

async function main() {
  console.log('Seeding database...')

  // Create demo organization
  const org = await prisma.organization.upsert({
    where: { slug: 'innung-elektro-stuttgart' },
    update: {},
    create: {
      name: 'Innung Elektrotechnik Stuttgart',
      slug: 'innung-elektro-stuttgart',
      plan: 'pilot',
      primaryColor: '#E63946',
      contactEmail: 'kontakt@innung-elektro-stuttgart.de',
    },
  })

  console.log(`Created organization: ${org.name}`)

  // Create demo admin user (better-auth manages sessions, we just pre-create the role)
  // In production: use the invite flow via the admin dashboard
  const adminUser = await prisma.user.upsert({
    where: { email: 'admin@demo.de' },
    update: {},
    create: {
      id: 'demo-admin-user-id',
      name: 'Demo Admin',
      email: 'admin@demo.de',
      emailVerified: true,
    },
  })

  // Create password account so email+password login works in dev
  await prisma.account.upsert({
    where: { id: 'demo-admin-account-id' },
    update: { password: DEMO_PASSWORD_HASH },
    create: {
      id: 'demo-admin-account-id',
      accountId: adminUser.id,
      providerId: 'credential',
      userId: adminUser.id,
      password: DEMO_PASSWORD_HASH,
    },
  })

  await prisma.userRole.upsert({
    where: { orgId_userId: { orgId: org.id, userId: adminUser.id } },
    update: {},
    create: {
      orgId: org.id,
      userId: adminUser.id,
      role: 'admin',
    },
  })

  // Create demo admin member record
  const adminMember = await prisma.member.upsert({
    where: { userId: adminUser.id },
    update: {},
    create: {
      orgId: org.id,
      userId: adminUser.id,
      name: 'Demo Admin',
      betrieb: 'Innungsgeschäftsstelle',
      sparte: 'Elektrotechnik',
      ort: 'Stuttgart',
      email: 'admin@demo.de',
      status: 'aktiv',
    },
  })

  // Create demo members
  const demoMembers = [
    {
      name: 'Klaus Müller',
      betrieb: 'Elektro Müller GmbH',
      sparte: 'Elektrotechnik',
      ort: 'Stuttgart',
      telefon: '+49 711 123456',
      email: 'mueller@elektro-mueller.de',
      istAusbildungsbetrieb: true,
      seit: 2015,
    },
    {
      name: 'Maria Schmidt',
      betrieb: 'Schmidt Elektrik',
      sparte: 'Elektrotechnik',
      ort: 'Ludwigsburg',
      telefon: '+49 7141 987654',
      email: 'schmidt@schmidt-elektrik.de',
      istAusbildungsbetrieb: false,
      seit: 2018,
    },
    {
      name: 'Thomas Weber',
      betrieb: 'Weber & Söhne Elektro',
      sparte: 'Informationstechnik',
      ort: 'Esslingen',
      telefon: '+49 711 555123',
      email: 'weber@weber-elektro.de',
      istAusbildungsbetrieb: true,
      seit: 2012,
    },
  ]

  const createdMembers = []
  for (const m of demoMembers) {
    const member = await prisma.member.create({
      data: { orgId: org.id, status: 'aktiv', ...m },
    })
    createdMembers.push(member)
  }
  console.log(`Created ${createdMembers.length} demo members`)

  // Create demo news
  const news1 = await prisma.news.create({
    data: {
      orgId: org.id,
      authorId: adminMember.id,
      title: 'Wichtige Änderungen bei der Gesellenprüfung 2025',
      body: `## Änderungen ab Herbst 2025

Die Prüfungsordnung wurde angepasst. Folgende Änderungen sind zu beachten:

- **Prüfungsteil A** (Gesellenstück) wird auf 2 Tage ausgeweitet
- Neue digitale Komponenten in Prüfungsteil B
- Anmeldeschluss ist der **15. September 2025**

Weitere Details entnehmen Sie dem beigefügten Rundschreiben.`,
      kategorie: 'Pruefung',
      publishedAt: new Date(),
    },
  })

  await prisma.news.create({
    data: {
      orgId: org.id,
      authorId: adminMember.id,
      title: 'Förderung für Ausbildungsbetriebe: Jetzt beantragen!',
      body: `## Neue Fördergelder verfügbar

Das Land Baden-Württemberg stellt für das Jahr 2025 zusätzliche Fördermittel für Ausbildungsbetriebe bereit.

**Förderhöhe:** Bis zu 3.000 € pro Auszubildenden

**Voraussetzungen:**
- Mitglied in einer anerkannten Innung
- Erstauszubildende oder benachteiligte Jugendliche

Anträge bis **31. März 2025** einreichen.`,
      kategorie: 'Foerderung',
      publishedAt: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
    },
  })

  console.log('Created demo news articles')

  // Create demo Termin
  await prisma.termin.create({
    data: {
      orgId: org.id,
      titel: 'Herbst-Gesellenprüfung 2025',
      datum: new Date('2025-11-15'),
      uhrzeit: '08:00',
      endeDatum: new Date('2025-11-16'),
      endeUhrzeit: '17:00',
      ort: 'Berufsschule Stuttgart-Mitte',
      adresse: 'Neckarstraße 22, 70190 Stuttgart',
      typ: 'Pruefung',
      beschreibung: 'Praktische und theoretische Gesellenprüfung für Elektrotechniker.',
      maxTeilnehmer: 30,
    },
  })

  await prisma.termin.create({
    data: {
      orgId: org.id,
      titel: 'Innungsversammlung Winter 2025',
      datum: new Date('2025-12-03'),
      uhrzeit: '19:00',
      endeUhrzeit: '21:00',
      ort: 'Gasthof Zum Lamm',
      adresse: 'Marktplatz 5, 70173 Stuttgart',
      typ: 'Versammlung',
      beschreibung: 'Jährliche Winterversammlung mit Jahresrückblick und Vorstandswahlen.',
    },
  })

  console.log('Created demo Termine')

  // Create demo Stelle
  await prisma.stelle.create({
    data: {
      orgId: org.id,
      memberId: createdMembers[0].id,
      sparte: 'Elektrotechnik',
      stellenAnz: 2,
      verguetung: '620-750 € / Monat',
      lehrjahr: 'beliebig',
      beschreibung:
        'Wir suchen motivierte Auszubildende für unser erfolgreiches Elektroinstallationsunternehmen. Moderner Fuhrpark, faire Vergütung, Übernahmechancen.',
      kontaktEmail: 'mueller@elektro-mueller.de',
      kontaktName: 'Klaus Müller',
      aktiv: true,
    },
  })

  console.log('Created demo Stelle')
  console.log('Seeding complete!')
}

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