import {defineArrayMember, defineField, defineType} from "sanity";

// Keep a local seed to avoid cross-app imports (CMS must not depend on storefront files).
const defaultSiteTextSeed: Record<string, string> = {
  "header.topBanner": "Livraison offerte des 150 EUR d'achat",
  "header.nav.home": "Accueil",
  "header.nav.shop": "Boutique",
  "header.nav.account": "Compte",
  "footer.navTitle": "Navigation",
  "footer.nav.home": "Accueil",
  "footer.nav.shop": "Boutique",
  "home.heroFallbackTitle": "Votre style unique",
  "home.feature.1.title": "Atelier humain",
  "shop.title.all": "Toutes nos creations",
  "auth.login.title": "Bon retour",
  "auth.register.title": "Creer mon compte",
  "notice.checkout-login-required": "Connectez-vous ou creez un compte pour finaliser votre paiement.",
  "search.page.title": "Trouver un produit",
  "cart.page.title": "Panier",
  "cart.checkout.authTitle": "Connexion requise avant paiement",
  "cart.checkout.authDescription": "Pour valider votre commande et suivre son avancement, connectez-vous ou creez un compte.",
  "cart.checkout.loginCta": "Se connecter",
  "cart.checkout.registerCta": "Creer un compte",
  "cart.total": "Total",
  "account.eyebrow": "Mon compte",
  "account.ordersTitle": "Mes commandes",
  "orders.title": "Mes commandes",
  "product.craftBadge": "Piece artisanale",
  "learn.ctaTitle": "A vous de jouer !",
  "success.orderTitle": "Commande",
  "legal.mentions.title": "Mentions legales",
  "legal.privacy.title": "Politique de confidentialite",
  "legal.cookies.title": "Politique de cookies",
  "legal.rgpd.title": "Exercer vos droits",
  "footer.legal.cgu": "CGU",
  "legal.cgv.title": "Conditions generales de vente (CGV)",
  "legal.cookiesPref.title": "Preferences cookies",
  "cookie.banner.title": "Cookies",
  "cookie.pref.save": "Enregistrer mes preferences",
};

type FolderItem = {
  _key: string;
  key: string;
  label: string;
  value: string;
};

type Folder = {
  _key: string;
  title: string;
  items: FolderItem[];
};

const FOLDER_LABELS: Record<string, string> = {
  header: "Header",
  footer: "Footer",
  home: "Accueil",
  shop: "Boutique",
  auth: "Auth",
  notice: "Messages",
  search: "Recherche",
  cart: "Panier",
  account: "Compte",
  orders: "Commandes",
  product: "Produit",
  learn: "En savoir plus",
  success: "Commande succes",
  legal: "Legal",
  cookie: "Cookies",
};

function toLabelFromKey(key: string) {
  const parts = key.split(".");
  if (parts.length <= 1) return key;
  return parts
    .slice(1)
    .join(" / ")
    .replace(/([a-z])([A-Z])/g, "$1 $2");
}

function toFolderTitle(prefix: string) {
  return FOLDER_LABELS[prefix] || `${prefix[0]?.toUpperCase() || ""}${prefix.slice(1)}`;
}

function buildFolderInitialValue(): Folder[] {
  const grouped = new Map<string, FolderItem[]>();

  Object.entries(defaultSiteTextSeed).forEach(([key, value], index) => {
    const prefix = key.split(".")[0] || "misc";
    const list = grouped.get(prefix) || [];
    list.push({
      _key: `item-${index}`,
      key,
      label: toLabelFromKey(key),
      value,
    });
    grouped.set(prefix, list);
  });

  return Array.from(grouped.entries())
    .sort(([a], [b]) => toFolderTitle(a).localeCompare(toFolderTitle(b), "fr"))
    .map(([prefix, items], index) => ({
      _key: `folder-${index}`,
      title: toFolderTitle(prefix),
      items: items.sort((a, b) => a.key.localeCompare(b.key, "fr")),
    }));
}

export const siteTextSettings = defineType({
  name: "siteTextSettings",
  title: "Site Text Settings",
  type: "document",
  fields: [
    defineField({
      name: "folders",
      title: "Arborescence du site",
      type: "array",
      initialValue: buildFolderInitialValue(),
      of: [
        defineArrayMember({
          name: "textFolder",
          type: "object",
          fields: [
            defineField({
              name: "title",
              title: "Dossier",
              type: "string",
              validation: (rule) => rule.required().min(2),
            }),
            defineField({
              name: "items",
              title: "Textes",
              type: "array",
              of: [
                defineArrayMember({
                  name: "textItem",
                  type: "object",
                  fields: [
                    defineField({
                      name: "key",
                      title: "Cle technique",
                      type: "string",
                      validation: (rule) => rule.required().min(3),
                    }),
                    defineField({
                      name: "label",
                      title: "Label",
                      type: "string",
                    }),
                    defineField({
                      name: "value",
                      title: "Texte",
                      type: "text",
                      rows: 3,
                      validation: (rule) => rule.required(),
                    }),
                  ],
                  preview: {
                    select: {title: "label", subtitle: "key", media: "value"},
                    prepare(selection) {
                      return {
                        title: selection.title || selection.subtitle || "Texte",
                        subtitle: selection.subtitle,
                      };
                    },
                  },
                }),
              ],
              validation: (rule) => rule.required(),
            }),
          ],
          preview: {
            select: {title: "title", items: "items"},
            prepare(selection) {
              const count = Array.isArray(selection.items) ? selection.items.length : 0;
              return {
                title: selection.title || "Dossier",
                subtitle: `${count} texte${count > 1 ? "s" : ""}`,
              };
            },
          },
        }),
      ],
    }),
    defineField({
      name: "entries",
      title: "Legacy entries",
      type: "array",
      hidden: true,
      of: [
        defineArrayMember({
          type: "object",
          fields: [
            defineField({
              name: "key",
              type: "string",
              validation: (rule) => rule.required().min(3),
            }),
            defineField({
              name: "value",
              type: "text",
              rows: 2,
              validation: (rule) => rule.required(),
            }),
          ],
          preview: {
            select: {title: "key", subtitle: "value"},
          },
        }),
      ],
    }),
  ],
  preview: {
    select: {folders: "folders"},
    prepare(selection) {
      const count = Array.isArray(selection.folders) ? selection.folders.length : 0;
      return {
        title: "Site Text Settings",
        subtitle: `${count} dossier${count > 1 ? "s" : ""}`,
      };
    },
  },
});
