import "dotenv/config";
import { PrismaClient } from "@prisma/client";
import { PrismaPg } from "@prisma/adapter-pg";

const adapter = new PrismaPg({
  connectionString: process.env.DATABASE_URL!,
});

const prisma = new PrismaClient({ adapter });

async function main() {
  const pelotesUniques = await prisma.category.upsert({
    where: { slug: "pelotes-uniques" },
    update: {},
    create: {
      name: "Pelotes uniques",
      slug: "pelotes-uniques",
      description: "Découvrez les pelotes uniques teintes artisanalement.",
      seoTitle: "Pelotes uniques | Jour J Création",
      seoDescription:
        "Explorez les pelotes uniques de Jour J Création, teintes artisanalement avec soin.",
      isVisible: true,
      sortOrder: 1,
    },
  });

  const kits2 = await prisma.category.upsert({
    where: { slug: "kits-2-pelotes" },
    update: {},
    create: {
      name: "Kits 2 pelotes",
      slug: "kits-2-pelotes",
      description: "Sélection de kits de 2 pelotes assorties.",
      seoTitle: "Kits 2 pelotes | Jour J Création",
      seoDescription:
        "Découvrez les kits de 2 pelotes proposés par Jour J Création.",
      isVisible: true,
      sortOrder: 2,
    },
  });

  const kits3 = await prisma.category.upsert({
    where: { slug: "kits-3-pelotes" },
    update: {},
    create: {
      name: "Kits 3 pelotes",
      slug: "kits-3-pelotes",
      description: "Sélection de kits de 3 pelotes assorties.",
      seoTitle: "Kits 3 pelotes | Jour J Création",
      seoDescription:
        "Découvrez les kits de 3 pelotes proposés par Jour J Création.",
      isVisible: true,
      sortOrder: 3,
    },
  });

  const kits4 = await prisma.category.upsert({
    where: { slug: "kits-4-pelotes" },
    update: {},
    create: {
      name: "Kits 4 pelotes",
      slug: "kits-4-pelotes",
      description: "Sélection de kits de 4 pelotes assorties.",
      seoTitle: "Kits 4 pelotes | Jour J Création",
      seoDescription:
        "Découvrez les kits de 4 pelotes proposés par Jour J Création.",
      isVisible: true,
      sortOrder: 4,
    },
  });

  const kits5 = await prisma.category.upsert({
    where: { slug: "kits-5-pelotes" },
    update: {},
    create: {
      name: "Kits 5 pelotes",
      slug: "kits-5-pelotes",
      description: "Sélection de kits de 5 pelotes assorties.",
      seoTitle: "Kits 5 pelotes | Jour J Création",
      seoDescription:
        "Découvrez les kits de 5 pelotes proposés par Jour J Création.",
      isVisible: true,
      sortOrder: 5,
    },
  });

  const pages = [
    {
      title: "Accueil",
      slug: "accueil",
      excerpt: "Page d’accueil du site Jour J Création.",
      seoTitle: "Jour J Création | Laines teintes artisanalement",
      seoDescription:
        "Découvrez l’univers de Jour J Création, ses laines teintes artisanalement et ses créations uniques.",
    },
    {
      title: "Qui suis-je",
      slug: "qui-suis-je",
      excerpt: "Présentation de la créatrice et de son univers.",
      seoTitle: "Qui suis-je | Jour J Création",
      seoDescription:
        "Découvrez le parcours et l’univers de la créatrice de Jour J Création.",
    },
    {
      title: "Sources d’inspiration",
      slug: "sources-d-inspiration",
      excerpt: "Les inspirations derrière les collections et les teintes.",
      seoTitle: "Sources d’inspiration | Jour J Création",
      seoDescription:
        "Explorez les sources d’inspiration qui nourrissent l’univers créatif de Jour J Création.",
    },
    {
      title: "Travail de teinturière",
      slug: "travail-de-teinturiere",
      excerpt: "Le savoir-faire artisanal autour de la teinture.",
      seoTitle: "Travail de teinturière | Jour J Création",
      seoDescription:
        "Découvrez le travail artisanal de teinture réalisé par Jour J Création.",
    },
    {
      title: "Spécificités des produits",
      slug: "specificites-des-produits",
      excerpt: "Les particularités et qualités des produits proposés.",
      seoTitle: "Spécificités des produits | Jour J Création",
      seoDescription:
        "Apprenez-en plus sur les spécificités des produits proposés par Jour J Création.",
    },
    {
      title: "Conseils d’entretien",
      slug: "conseils-d-entretien",
      excerpt: "Les recommandations pour entretenir vos laines et créations.",
      seoTitle: "Conseils d’entretien | Jour J Création",
      seoDescription:
        "Retrouvez les conseils d’entretien pour préserver vos laines et créations.",
    },
    {
      title: "Contact",
      slug: "contact",
      excerpt: "Page de contact de Jour J Création.",
      seoTitle: "Contact | Jour J Création",
      seoDescription:
        "Contactez Jour J Création pour toute question sur les produits ou commandes.",
    },
  ];

  for (const page of pages) {
    await prisma.page.upsert({
      where: { slug: page.slug },
      update: {},
      create: {
        ...page,
        isPublished: false,
      },
    });
  }

  type ShopifyProduct = {
    title: string;
    handle: string;
    body_html: string;
    published_at: string | null;
    variants: Array<{
      price: string;
      available: boolean;
    }>;
    images: Array<{
      src: string;
      position: number;
    }>;
  };

  const stripHtml = (value: string) =>
    value
      .replace(/<br\s*\/?>/gi, "\n")
      .replace(/<[^>]*>/g, " ")
      .replace(/&nbsp;/g, " ")
      .replace(/&quot;/g, '"')
      .replace(/&#39;/g, "'")
      .replace(/\s+/g, " ")
      .trim();

  const normalizeLabel = (value: string) =>
    value
      .toLowerCase()
      .normalize("NFD")
      .replace(/[\u0300-\u036f]/g, "");

  const inferFamily = (title: string) => {
    const label = normalizeLabel(title);

    if (
      /\b5[ps]\d{2}\b/.test(label) ||
      label.includes("kit de 5") ||
      label.includes("5 echevaux") ||
      label.includes("5 pelotes")
    ) {
      return { categoryId: kits5.id, sortOrder: 5 };
    }

    if (
      /\b4[ps]\d{2}\b/.test(label) ||
      label.includes("kit de 4") ||
      label.includes("4 echevaux") ||
      label.includes("4 pelotes")
    ) {
      return { categoryId: kits4.id, sortOrder: 4 };
    }

    if (
      /\b3[ps]\d{2}\b/.test(label) ||
      label.includes("kit de 3") ||
      label.includes("3 echevaux") ||
      label.includes("3 pelotes")
    ) {
      return { categoryId: kits3.id, sortOrder: 3 };
    }

    if (
      /\b2[ps]\d{2}\b/.test(label) ||
      label.includes("kit de 2") ||
      label.includes("2 echevaux") ||
      label.includes("2 pelotes")
    ) {
      return { categoryId: kits2.id, sortOrder: 2 };
    }

    return { categoryId: pelotesUniques.id, sortOrder: 1 };
  };

  const inferGlitter = (title: string) => {
    const label = normalizeLabel(title);
    return label.includes("paillettes") || /\b[1-5]p\d{2}\b/.test(label);
  };

  const buildShortDescription = (title: string, isGlitter: boolean) => {
    const family = inferFamily(title).sortOrder;

    if (family === 1) {
      return isGlitter
        ? "Pelote unique teinte à la main avec éclat pailleté."
        : "Pelote unique teinte à la main, prête à rejoindre la collection.";
    }

    if (family === 2) {
      return isGlitter
        ? "Kit de 2 pelotes teintes à la main dont une version à paillettes."
        : "Kit de 2 pelotes teintes à la main, composition prête à tricoter.";
    }

    if (family === 3) {
      return isGlitter
        ? "Kit de 3 pelotes teintes à la main avec présence de paillettes."
        : "Kit de 3 pelotes teintes à la main, harmonie complète prête à tricoter.";
    }

    if (family === 4) {
      return isGlitter
        ? "Kit de 4 pelotes teintes à la main avec présence de paillettes."
        : "Kit de 4 pelotes teintes à la main, harmonie complète prête à tricoter.";
    }

    return isGlitter
      ? "Kit de 5 pelotes teintes à la main avec présence de paillettes."
      : "Kit de 5 pelotes teintes à la main, harmonie complète prête à tricoter.";
  };

  const buildSeoTitle = (title: string) => `${title} | Jour J Création`;
  const buildSeoDescription = (title: string) => `${title} disponible dans la boutique Jour J Création.`;

  const response = await fetch("https://jourjcreation.com/collections/all/products.json?limit=250&page=1", {
    headers: {
      Accept: "application/json",
    },
  });

  if (!response.ok) {
    throw new Error(`Impossible de récupérer le catalogue Shopify (${response.status})`);
  }

  const payload = (await response.json()) as { products: ShopifyProduct[] };

  for (const sourceProduct of payload.products) {
    const title = sourceProduct.title.trim();
    const description = stripHtml(sourceProduct.body_html || "") || title;
    const firstVariant = sourceProduct.variants[0];
    const price = firstVariant?.price ?? "0.00";
    const isPublished = Boolean(sourceProduct.published_at);
    const isFeatured = /\b[1-5][ps]0[1-3]\b/i.test(title);
    const isGlitter = inferGlitter(title);
    const { categoryId } = inferFamily(title);
    const stock = firstVariant?.available ? 1 : 0;

    const product = await prisma.product.upsert({
      where: { slug: sourceProduct.handle },
      update: {
        name: title,
        shortDescription: buildShortDescription(title, isGlitter),
        description,
        price,
        stock,
        isPublished,
        isFeatured,
        isGlitter,
        material: "Mérinos superwash, nylon",
        color: null,
        careInstructions: "Lavage à la main à froid ou légèrement tiède. Séchage à plat.",
        seoTitle: buildSeoTitle(title),
        seoDescription: buildSeoDescription(title),
        categoryId,
      },
      create: {
        name: title,
        slug: sourceProduct.handle,
        shortDescription: buildShortDescription(title, isGlitter),
        description,
        price,
        stock,
        isPublished,
        isFeatured,
        isGlitter,
        material: "Mérinos superwash, nylon",
        color: null,
        careInstructions: "Lavage à la main à froid ou légèrement tiède. Séchage à plat.",
        seoTitle: buildSeoTitle(title),
        seoDescription: buildSeoDescription(title),
        categoryId,
      },
    });

    await prisma.productImage.deleteMany({
      where: { productId: product.id },
    });

    if (sourceProduct.images.length > 0) {
      await prisma.productImage.createMany({
        data: sourceProduct.images.map((image) => ({
          productId: product.id,
          imageUrl: image.src,
          alt: title,
          sortOrder: image.position ?? 1,
        })),
      });
    }
  }

  console.log("✅ Seed terminé avec succès");
}

main()
  .catch((e) => {
    console.error("❌ Erreur seed :", e);
    process.exit(1);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });