import * as dotenv from 'dotenv';
import * as fs from 'fs';
import * as path from 'path';
import mongoose from 'mongoose';
import Gallery from '../Features/gallery/schema/gallery.schema';
import {
  copyFileToUploads,
  deleteUploadFile,
  resolveUploadFilePath,
} from '../helpers/upload-file.helper';

dotenv.config();

const WEB_PUBLIC = path.resolve(__dirname, '../../../web/public');

type GallerySeedItem = {
  title: string;
  category: 'Studio' | 'Hair' | 'Nails' | 'Beauty';
  source: string;
  sortOrder: number;
  slug: string;
};

const GALLERY_SEED: GallerySeedItem[] = [
  { title: 'Studio Entrance', category: 'Studio', source: 'res/entrance.jpeg', sortOrder: 0, slug: 'studio-entrance' },
  {
    title: 'Luxury Lounge',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.05.jpeg',
    sortOrder: 1,
    slug: 'luxury-lounge',
  },
  {
    title: 'Studio Showcase 1',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.02.jpeg',
    sortOrder: 2,
    slug: 'studio-showcase-1',
  },
  {
    title: 'Studio Showcase 2',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.02 (1).jpeg',
    sortOrder: 3,
    slug: 'studio-showcase-2',
  },
  {
    title: 'Studio Showcase 3',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.02 (2).jpeg',
    sortOrder: 4,
    slug: 'studio-showcase-3',
  },
  {
    title: 'Studio Showcase 4',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.02 (3).jpeg',
    sortOrder: 5,
    slug: 'studio-showcase-4',
  },
  {
    title: 'Studio Showcase 5',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.03.jpeg',
    sortOrder: 6,
    slug: 'studio-showcase-5',
  },
  {
    title: 'Studio Showcase 6',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.03 (1).jpeg',
    sortOrder: 7,
    slug: 'studio-showcase-6',
  },
  {
    title: 'Studio Showcase 7',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.04.jpeg',
    sortOrder: 8,
    slug: 'studio-showcase-7',
  },
  {
    title: 'Studio Showcase 8',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.04 (1).jpeg',
    sortOrder: 9,
    slug: 'studio-showcase-8',
  },
  {
    title: 'Studio Showcase 9',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.04 (2).jpeg',
    sortOrder: 10,
    slug: 'studio-showcase-9',
  },
  {
    title: 'Studio Showcase 10',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.05 (1).jpeg',
    sortOrder: 11,
    slug: 'studio-showcase-10',
  },
  {
    title: 'Studio Showcase 11',
    category: 'Studio',
    source: 'res/WhatsApp Image 2026-06-10 at 01.16.06.jpeg',
    sortOrder: 12,
    slug: 'studio-showcase-11',
  },
  {
    title: 'Hair Styling',
    category: 'Hair',
    source: 'services/hair-extension.jpeg',
    sortOrder: 13,
    slug: 'hair-styling',
  },
  {
    title: 'Afro Braids',
    category: 'Hair',
    source: 'services/braids.jpeg',
    sortOrder: 14,
    slug: 'afro-braids',
  },
  {
    title: 'Nail Art',
    category: 'Nails',
    source: 'services/nails.jpeg',
    sortOrder: 15,
    slug: 'nail-art',
  },
  {
    title: 'Manicure',
    category: 'Nails',
    source: 'services/madicure.jpeg',
    sortOrder: 16,
    slug: 'manicure',
  },
  {
    title: 'Pedicure',
    category: 'Nails',
    source: 'services/pedicure.jpeg',
    sortOrder: 17,
    slug: 'pedicure',
  },
  {
    title: 'Lash Extensions',
    category: 'Beauty',
    source: 'services/eyelashes.jpeg',
    sortOrder: 18,
    slug: 'lash-extensions',
  },
];

async function seedGallery() {
  await mongoose.connect(process.env.DB_URL as string);

  let created = 0;
  let updated = 0;
  let skipped = 0;

  for (const item of GALLERY_SEED) {
    const sourcePath = path.join(WEB_PUBLIC, item.source);
    if (!fs.existsSync(sourcePath)) {
      console.warn(`Missing source file, skipped: ${item.source}`);
      skipped += 1;
      continue;
    }

    const existing = await Gallery.findOne({ title: item.title });
    const existingUploadPath = existing?.imageUrl ? resolveUploadFilePath(existing.imageUrl) : null;
    const hasValidUpload = Boolean(existingUploadPath && fs.existsSync(existingUploadPath));

    if (existing && hasValidUpload) {
      await Gallery.updateOne(
        { _id: existing._id },
        {
          $set: {
            category: item.category,
            sortOrder: item.sortOrder,
            isPublished: true,
          },
        }
      );
      skipped += 1;
      continue;
    }

    if (existing?.imageUrl) {
      deleteUploadFile(existing.imageUrl);
    }

    const imageUrl = copyFileToUploads(sourcePath, item.slug);

    if (existing) {
      await Gallery.updateOne(
        { _id: existing._id },
        {
          $set: {
            category: item.category,
            imageUrl,
            sortOrder: item.sortOrder,
            isPublished: true,
          },
        }
      );
      updated += 1;
      continue;
    }

    await Gallery.create({
      title: item.title,
      category: item.category,
      imageUrl,
      sortOrder: item.sortOrder,
      isPublished: true,
    });
    created += 1;
  }

  console.log(`Gallery seed complete: ${created} created, ${updated} updated, ${skipped} skipped`);
  await mongoose.disconnect();
}

seedGallery().catch((error) => {
  console.error(error);
  process.exit(1);
});
