import { db } from '../config/database.js';
import { events, galleryImages } from '../db/schema.js';
import fs from 'fs';
import path from 'path';
import sharp from 'sharp';

// Old events data
const oldEvents = [
  {
    image: "/images/events/event_karaoke.jpg",
    title: "Karaoke",
    date: "2025-12-31", // Set as ongoing event
    description: `Bei uns gibt es Karaoke Mi-Sa!! <br>
Seid ihr eine Gruppe und lieber unter euch? ..unseren 2.Stock kannst du auch mieten ;) <br>
Reserviere am besten gleich per Whatsapp <a href="tel:+41772322770">077 232 27 70</a>`,
    displayOrder: 0,
  },
  {
    image: "/images/events/event_pub-quiz.jpg",
    title: "Pub Quiz",
    date: "2025-12-31", // Set as ongoing event
    description: `Jeden Freitag findet unser <b>Pub Quiz</b> statt. Gespielt wird tischweise in 3-4 Runden. <br>
Jede Woche gibt es ein anderes Thema. Es geht um Ruhm und Ehre und zusätzlich werden die Sieger der Herzen durch das Publikum gekürt! <3 <br>
Auch Einzelpersonen sind herzlich willkommen! <br>
*zum mitmachen minimum 1 Getränk konsumieren oder 5CHF`,
    displayOrder: 1,
  },
  {
    image: "/images/events/event_schlager-karaoke.jpeg",
    title: "Schlager Hüttenzauber Karaoke",
    date: "2025-11-27",
    description: `Ab 19:00 Uhr Eintritt ist Frei! Reservieren unter <a href="tel:+41772322770">077 232 27 70</a>`,
    displayOrder: 2,
  },
  {
    image: "/images/events/event_advents-kalender.jpeg",
    title: "Adventskalender",
    date: "2025-12-20",
    description: `Jeden Tag neue Überraschungen! Check unsere Social Media Stories!`,
    displayOrder: 3,
  },
  {
    image: "/images/events/event_santa_karaoke.jpeg",
    title: "Santa Karaoke-Party",
    date: "2025-12-06",
    description: `🤶🏻🎅🏻Komme als Weihnachts-Mann/-Frau und bekomme einen Shot auf's Haus!🤶🏻🎅🏻`,
    displayOrder: 4,
  },
  {
    image: "/images/events/event_ferien.jpeg",
    title: "Weihnachtsferien",
    date: "2025-12-21",
    description: `Wir sind ab 02.01.2026 wieder wie gewohnt für euch da! 🍀. <br> Für Anfragen WA <a href="tel:+41772322770">077 232 27 70</a> Antwort innerhalb 48h`,
    displayOrder: 5,
  },
  {
    image: "/images/events/event_neujahrs-apero.jpeg",
    title: "Neujahrs-Apero",
    date: "2026-01-02",
    description: `18:00-20:00 Uhr`,
    displayOrder: 6,
  },
];

// Old gallery images
const oldGalleryImages = [
  { src: "/images/gallery/Gallery7.png", alt: "Gallery 7" },
  { src: "/images/gallery/Gallery8.png", alt: "Gallery 8" },
  { src: "/images/gallery/Gallery9.png", alt: "Gallery 9" },
  { src: "/images/gallery/Gallery6.png", alt: "Gallery 6" },
  { src: "/images/gallery/Gallery1.png", alt: "Gallery 1" },
  { src: "/images/gallery/Gallery2.png", alt: "Gallery 2" },
  { src: "/images/gallery/Gallery3.png", alt: "Gallery 3" },
  { src: "/images/gallery/Gallery4.png", alt: "Gallery 4" },
  { src: "/images/gallery/Gallery5.png", alt: "Gallery 5" },
];

async function copyAndConvertImage(
  sourcePath: string,
  destDir: string,
  filename: string
): Promise<string> {
  const projectRoot = path.join(process.cwd(), '..');
  const fullSourcePath = path.join(projectRoot, 'public', sourcePath);

  // Ensure destination directory exists
  if (!fs.existsSync(destDir)) {
    fs.mkdirSync(destDir, { recursive: true });
  }

  const ext = path.extname(filename);
  const baseName = path.basename(filename, ext);
  const webpFilename = `${baseName}.webp`;
  const destPath = path.join(destDir, webpFilename);

  console.log(`Processing: ${fullSourcePath} -> ${destPath}`);

  // Check if source exists
  if (!fs.existsSync(fullSourcePath)) {
    console.error(`Source file not found: ${fullSourcePath}`);
    throw new Error(`Source file not found: ${fullSourcePath}`);
  }

  // Convert to webp and copy
  await sharp(fullSourcePath)
    .rotate() // Auto-rotate based on EXIF
    .resize({ width: 1600, withoutEnlargement: true })
    .webp({ quality: 85 })
    .toFile(destPath);

  return `/images/${path.relative(destDir, destPath).replace(/\\/g, '/')}`;
}

async function migrateEvents() {
  console.log('\n=== Migrating Events ===\n');

  const dataDir = process.env.GIT_WORKSPACE_DIR || path.join(process.cwd(), 'data');
  const eventsImageDir = path.join(dataDir, 'images', 'events');

  for (const event of oldEvents) {
    try {
      const filename = path.basename(event.image);
      const newImageUrl = await copyAndConvertImage(
        event.image,
        eventsImageDir,
        filename
      );

      const [newEvent] = await db.insert(events).values({
        title: event.title,
        date: event.date,
        description: event.description,
        imageUrl: newImageUrl,
        displayOrder: event.displayOrder,
        isPublished: true,
      }).returning();

      console.log(`✓ Migrated event: ${newEvent.title}`);
    } catch (error) {
      console.error(`✗ Failed to migrate event "${event.title}":`, error);
    }
  }
}

async function migrateGallery() {
  console.log('\n=== Migrating Gallery Images ===\n');

  const dataDir = process.env.GIT_WORKSPACE_DIR || path.join(process.cwd(), 'data');
  const galleryImageDir = path.join(dataDir, 'images', 'gallery');

  for (let i = 0; i < oldGalleryImages.length; i++) {
    const img = oldGalleryImages[i];
    try {
      const filename = path.basename(img.src);
      const newImageUrl = await copyAndConvertImage(
        img.src,
        galleryImageDir,
        filename
      );

      const [newImage] = await db.insert(galleryImages).values({
        imageUrl: newImageUrl,
        altText: img.alt,
        displayOrder: i,
        isPublished: true,
      }).returning();

      console.log(`✓ Migrated gallery image: ${newImage.altText}`);
    } catch (error) {
      console.error(`✗ Failed to migrate gallery image "${img.alt}":`, error);
    }
  }
}

async function main() {
  console.log('Starting migration of old data...\n');
  console.log('Working directory:', process.cwd());
  console.log('Data directory:', process.env.GIT_WORKSPACE_DIR || path.join(process.cwd(), 'data'));

  try {
    await migrateEvents();
    await migrateGallery();
    console.log('\n✓ Migration completed successfully!');
  } catch (error) {
    console.error('\n✗ Migration failed:', error);
    process.exit(1);
  }
}

main();
