require('dotenv').config();
const bcrypt = require('bcryptjs');
const store = require('./store');

// Compte admin (créé au premier démarrage à partir des variables d'environnement)
(function seedAdmin() {
  const email = (process.env.ADMIN_EMAIL || 'admin@site.fr').trim().toLowerCase();
  const pwd = process.env.ADMIN_PASSWORD || 'admin1234';
  if (!store.getUserByEmail(email)) {
    store.createUser(email, bcrypt.hashSync(pwd, 10));
    console.log('\u2192 Compte admin cr\u00e9\u00e9 : ' + email);
  }
})();

// Biens de démonstration (uniquement si vide)
(function seedBiens() {
  if (store.bienCount() > 0) return;
  const commod = "Salle de sport\nTerrain de padel\nPiscine olympique\nParking souterrain\nSécurité 24/7\nEspaces verts";
  const demo = [
    {
      categorie: 'residence', titre: 'Résidence Panoramic', typologie: 'Résidence',
      lieu: 'Oran · Boulevard Millénium', adresse: 'Boulevard Millénium, Oran, Algérie',
      prix: 'Prix sur demande', palier: '3 blocs · 4 appartements par palier',
      commodites: commod,
      description: "Une résidence de standing au cœur d'Oran, sécurisée et paysagère, pensée pour le confort et la sérénité des familles.",
      typologies: [
        { nom: 'F3', nb: '24 appartements', superficie: '~90 m²', description: 'Séjour lumineux, 2 chambres, balcon.' },
        { nom: 'F4', nb: '18 appartements', superficie: '~120 m²', description: "Double exposition, 3 chambres, 2 salles d'eau." },
        { nom: 'Duplex', nb: '6 duplex', superficie: '~160 m²', description: 'Duplex équipé sur 2 niveaux avec terrasse.' }
      ],
      image: 'https://images.unsplash.com/photo-1545324418-cc1a3fa10c00?auto=format&fit=crop&w=1400&q=80', position: 1
    },
    {
      categorie: 'villa', titre: 'Les Villas Panoramic', typologie: 'Villas',
      lieu: 'Oran · Boulevard Millénium', adresse: 'Boulevard Millénium, Oran, Algérie',
      prix: 'Prix sur demande', commodites: "Jardin privatif\nGarage\nSécurité 24/7\nEspaces verts",
      description: "Des villas individuelles aux belles prestations, avec jardin privatif et garage, pour plus d'espace et d'intimité.",
      typologies: [
        { nom: 'Villa F4', nb: '8 villas', superficie: '~200 m²', description: 'Jardin, garage 2 voitures, suite parentale.' },
        { nom: 'Villa F5', nb: '4 villas', superficie: '~260 m²', description: 'Grand jardin, double garage, 4 chambres.' }
      ],
      image: 'https://images.unsplash.com/photo-1613490493576-7fde63acd811?auto=format&fit=crop&w=1400&q=80', position: 2
    }
  ];
  demo.forEach(b => store.createBien({ ...b, actif: true }));
  console.log('Projets de demonstration ajoutes (residence + villas avec typologies).');
})();

// Avantages (équipements) de démonstration (uniquement si vide)
(function seedAvantages() {
  if (store.avantageCount() > 0) return;
  const av = [
    { icon: 'securite', titre: 'Sécurité 24h/24', texte: "Un service de sécurité présent jour et nuit, pour la tranquillité de tous les résidents.", position: 1 },
    { icon: 'piscine', titre: 'Piscine olympique', texte: "Une piscine olympique accessible à l'ensemble des résidents du complexe.", position: 2 },
    { icon: 'sport', titre: 'Salle de sport', texte: "Un espace fitness moderne, équipé d'appareils à la pointe de la technologie.", position: 3 },
    { icon: 'parking', titre: 'Parking souterrain', texte: "Un parking souterrain sécurisé pour les résidents comme pour leurs visiteurs.", position: 4 },
    { icon: 'espaces', titre: 'Espaces verts', texte: "Des espaces paysagers pour se détendre et profiter de la nature, au pied de chez soi.", position: 5 },
    { icon: 'commerce', titre: 'Centre commercial', texte: "Des commerces de proximité pour faciliter le quotidien des résidents.", position: 6 },
    { icon: 'jeux', titre: 'Aires de jeux', texte: "Des aires de jeux sécurisées, pour les enfants de tous les âges.", position: 7 },
    { icon: 'cinema', titre: 'Cinéma privé', texte: "Une salle de cinéma privée réservée aux résidents, pour des projections exclusives.", position: 8 }
  ];
  av.forEach(a => store.createAvantage({ ...a, actif: true }));
  console.log('\u2192 8 avantages de d\u00e9monstration ajout\u00e9s.');
})();

// Contenu éditable du site (ne remplit que les clés manquantes : ne réécrit jamais une valeur déjà modifiée)
(function seedContent() {
  const defaults = {
    hero_kicker: 'Benammar Promotion · Oran',
    hero_lead: "Une nouvelle adresse à Oran, pensée pour le confort, le standing et la sérénité des familles.",
    residence_text: "Une résidence sécurisée, équipée et paysagée, au cœur d'Oran — pensée pour les familles qui recherchent le confort, le standing et la tranquillité. Plus qu'un logement : une façon de vivre.",
    contact_address: 'Boulevard Millénium — Oran',
    contact_phone1: '+213 560 016 406',
    contact_phone2: '560 285 974',
    contact_email: 'Marketingmanager@benammar-urbain.com',
    contact_hours: 'Dimanche – Jeudi · 9h–12h / 14h–17h',
    loc_text: "Idéalement située Boulevard Millénium, la résidence bénéficie d'un emplacement de premier choix, à proximité des commerces, des écoles et des grands axes de la ville.",
    loc_address: 'Boulevard Millénium — Oran, Algérie'
  };
  const missing = {};
  for (const k of Object.keys(defaults)) {
    if (store.getContentValue(k) === undefined) missing[k] = defaults[k];
  }
  if (Object.keys(missing).length) {
    store.setContent(missing);
    console.log('\u2192 Contenu du site initialis\u00e9 (' + Object.keys(missing).length + ' champs).');
  }
})();

module.exports = { store };

// Migration douce (une seule fois) : si des données de démo existent déjà mais sont
// toutes masquées (anciennes installations), on les active pour le nouvel affichage dynamique.
(function migrateActivate() {
  if (store.getContentValue('_migrated_v3')) return;
  if (store.bienCount() > 0 && store.activeBiens().length === 0) {
    store.allBiens().forEach(b => store.updateBien(b.id, { ...b, actif: true }));
  }
  if (store.avantageCount() > 0 && store.activeAvantages().length === 0) {
    store.allAvantages().forEach(a => store.updateAvantage(a.id, { ...a, actif: true }));
  }
  store.setContent({ _migrated_v3: '1' });
})();

// Migration v5 : structure par catégorie. Backfill catégorie + slug + typologie
// sur les biens déjà créés (anciennes installations) sans rien écraser d'autre.
(function migrateV5() {
  if (store.getContentValue('_migrated_v5')) return;
  store.allBiens().forEach(b => {
    const typ = b.typologie || (b.lieu && b.lieu.indexOf('\u00b7') > -1 ? b.lieu.split('\u00b7').pop().trim() : '');
    store.updateBien(b.id, { ...b, categorie: b.categorie || 'residence', typologie: typ });
  });
  store.setContent({ _migrated_v5: '1' });
})();

// Migration v6 : modele projet -> typologies. Backfill des champs manquants.
(function migrateV6() {
  if (store.getContentValue('_migrated_v6')) return;
  store.allBiens().forEach(function(b){
    var patch = Object.assign({}, b);
    if (!Array.isArray(b.typologies)) patch.typologies = [];
    if (b.commodites === undefined) patch.commodites = '';
    if (b.adresse === undefined) patch.adresse = b.lieu || '';
    store.updateBien(b.id, patch);
  });
  store.setContent({ _migrated_v6: '1' });
})();

if (require.main === module) console.log('Donn\u00e9es pr\u00eates : data.json');

// Import du catalogue réel (une seule fois) : 8 projets Benammar Promotion.
(function importCatalogueV1() {
  if (store.getContentValue('_import_catalogue_v1')) return;

  var projets = [
    {
      categorie: 'residence', titre: 'Résidence Panoramique', unites: '188 logements',
      lieu: "L'adresse emblématique face à la mer.", adresse: 'Gambetta, Oran, Algérie', avancement: 'Projet livré',
      description: "Située dans l'un des quartiers les plus recherchés d'Oran, la Résidence Panoramique est un programme de haut standing entièrement réalisé à Gambetta. Vue mer pour une partie des logements, et une typologie rare incluant une collection exclusive de duplex équipés. Une valeur sûre pour les acquéreurs recherchant confort immédiat et patrimoine sécurisé.",
      commodites: "Résidence livrée et sécurisée\nEmplacement stratégique Gambetta\nCuisine semi-équipée\nChauffage central\nClimatisation\nFibre optique\nCaméras\nDouble vitrage\nVidéophone\nSalle de sport\nCollection duplex équipés",
      typologies: [
        { nom: 'F4 — 117 m²', superficie: '117 m²' },
        { nom: 'F4 — 147 m²', superficie: '147 m²' },
        { nom: 'F4 — 160,25 m²', superficie: '160,25 m²' },
        { nom: 'F3 — 94,20 m²', superficie: '94,20 m²' },
        { nom: 'Duplex équipé — 342,25 m²', superficie: '342,25 m²' },
        { nom: 'Duplex équipé — 368,70 m²', superficie: '368,70 m²' }
      ]
    },
    {
      categorie: 'residence', titre: 'Résidence Rivera', unites: '120 logements',
      lieu: "Le meilleur équilibre entre confort, emplacement et investissement.", adresse: 'Oran, Algérie', avancement: '90 %',
      description: "Pensée pour répondre aux attentes des familles modernes, Résidence Rivera offre un excellent compromis entre qualité de construction, emplacement stratégique et budget maîtrisé. Un projet qui privilégie le confort quotidien tout en représentant un investissement durable.",
      commodites: "Cuisine semi-équipée\nChauffage central\nClimatisation centrale\nDouble vitrage\nVidéophone\nFibre optique\nRésidence fermée",
      typologies: [
        { nom: 'F4 — 95,70 m²', superficie: '95,70 m²' },
        { nom: 'F3 — 80,90 m²', superficie: '80,90 m²' }
      ]
    },
    {
      categorie: 'residence', titre: 'Résidence Lumina', unites: '180 logements',
      lieu: "Un quartier vivant où confort, services et qualité de vie se rencontrent.", adresse: 'Oran, Algérie', avancement: '68 %',
      description: "Lumina forme une véritable cité résidentielle dynamique au cœur d'Oran : commerces, restaurants, services, écoles privées et espaces de bien-être. Un cadre de vie autonome où tout est accessible à pied, avec des appartements offrant une splendide vue.",
      commodites: "Cuisine semi-équipée\nChauffage central\nClimatisation centrale\nDouble vitrage\nFibre optique\nCaméras de sécurité\nRésidence fermée\nCommerces\nÉcole privée\nRestauration\nSpa",
      typologies: [
        { nom: 'F4 — 137 m²', superficie: '137 m²' },
        { nom: 'F3 — 95,95 m²', superficie: '95,95 m²' },
        { nom: 'F2 — 69 m²', superficie: '69 m²' }
      ]
    },
    {
      categorie: 'residence', titre: 'Résidence Lumina Plus', unites: '165 logements',
      lieu: "Le futur du confort résidentiel.", adresse: 'Oran, Algérie', avancement: '45 %',
      description: "Extension de Lumina, Lumina Plus est un programme résidentiel nouvelle génération en construction, au cœur d'un quartier en plein développement : commerces, restauration, écoles privées et espaces de bien-être. Un large choix de logements encore disponibles, idéal pour habiter ou investir.",
      commodites: "Cuisine semi-équipée\nChauffage central\nClimatisation centrale\nDouble vitrage\nVidéophone\nFibre optique\nCaméras de sécurité\nRésidence fermée",
      typologies: [
        { nom: 'F4 — 137 m²', superficie: '137 m²' },
        { nom: 'F3 — 100 m²', superficie: '100 m²' },
        { nom: 'F2 — 58 m²', superficie: '58 m²' }
      ]
    },
    {
      categorie: 'residence', titre: 'Résidence Midina Garden', unites: '199 logements',
      lieu: "La nature au cœur du haut standing.", adresse: 'Oran, Algérie', avancement: '',
      description: "Midina Garden réinvente le confort urbain en offrant un véritable écrin de verdure au cœur d'Oran. Architecture élégante, vastes espaces paysagers et équipements premium : grand jardin central, piscine semi-olympique, spa et complexe sportif, pour le bien-être de toute la famille.",
      commodites: "Grand jardin central\nPiscine semi-olympique\nSpa\nComplexe sportif\nCuisine semi-équipée\nChauffage central\nClimatisation centrale\nDouble vitrage\nVidéophone\nFibre optique\nCaméras de sécurité\nRésidence fermée",
      typologies: [
        { nom: 'F4 — 110,80 m²', superficie: '110,80 m²' },
        { nom: 'F4 — 96,60 m²', superficie: '96,60 m²' },
        { nom: 'F3 — 74,70 m²', superficie: '74,70 m²' },
        { nom: 'F3 — 73 m²', superficie: '73 m²' },
        { nom: 'F5 — 136 m²', superficie: '136 m²' },
        { nom: 'F6 — 207 m²', superficie: '207 m²' }
      ]
    },
    {
      categorie: 'residence', titre: 'Résidence El Makam', unites: '312 logements',
      lieu: "Votre premier pas vers la propriété en toute sérénité.", adresse: 'Oran, Algérie', avancement: '',
      description: "Résidence El Makam rend l'accession à la propriété plus accessible, sans compromis sur la qualité de construction. Grâce au crédit bancaire et à des modalités de paiement adaptées, elle répond parfaitement aux familles souhaitant investir dans leur avenir.",
      commodites: "Crédit bancaire\nRésidence fermée\nChauffage central\nDouble vitrage\nFibre optique\nCaméras\nDouble ascenseur\nSalle de sport\nGrand jardin\nAire de jeux",
      typologies: [
        { nom: 'F4 — 95 m²', superficie: '95 m²' },
        { nom: 'F3 — 80 m²', superficie: '80 m²' }
      ]
    },
    {
      categorie: 'villa', titre: 'Résidence Soleil', unites: '82 villas',
      lieu: "Le privilège d'une résidence de villas d'exception.", adresse: 'Oran, Algérie', avancement: '',
      description: "Résidence Soleil est un domaine privé réservé à une clientèle recherchant espace, élégance et exclusivité. Chaque villa bénéficie d'un environnement sécurisé, d'équipements premium et d'un cadre de vie pensé pour le confort des familles.",
      commodites: "Résidence fermée\nVillas individuelles\nPiscine privative\nTerrain de football\nTerrain de padel\nCuisine semi-équipée\nChauffage central\nClimatisation centrale\nDouble vitrage\nSalle de sport\nFibre optique\nCaméras",
      typologies: [
        { nom: 'Villa Premium — 173,25 m²', superficie: '173,25 m²' },
        { nom: 'Villa Elegance — 190,42 m²', superficie: '190,42 m²' },
        { nom: 'Villa Platinium — 350 m²', superficie: '350 m²' },
        { nom: 'Villa Prestige — 260 m²', superficie: '260 m²' }
      ]
    },
    {
      categorie: 'villa', titre: 'Résidence Saphyr', unites: 'Villas',
      lieu: "Le luxe prend une nouvelle adresse à Oran.", adresse: 'Oran, Algérie', avancement: '',
      description: "Résidence Saphyr est un nouveau programme de villas conçu pour une clientèle en quête d'exclusivité, de liberté et de personnalisation. Son architecture contemporaine et la qualité de sa conception en font une opportunité rare pour bâtir un patrimoine durable dans un cadre privilégié.",
      commodites: "Résidence privée\nVillas personnalisables (à confirmer)\nArchitecture contemporaine\nEnvironnement sécurisé\nCuisine\nChauffage central\nClimatisation centrale\nDouble vitrage\nFibre optique\nCaméras\nSalle de sport\nPiscine",
      typologies: [
        { nom: 'Villa personnalisable', description: 'Villas personnalisables selon le positionnement définitif.' }
      ]
    }
  ];

  // Retire les projets de démonstration
  var demos = ['Résidence Panoramic', 'Les Villas Panoramic', 'Le 3 pièces', 'Le 4 pièces', 'Le duplex équipé', 'La villa 4 pièces', 'Résidence Test'];
  store.allBiens().forEach(function (b) { if (demos.indexOf(b.titre) > -1) store.deleteBien(b.id); });

  var existing = store.allBiens().map(function (b) { return b.titre; });
  projets.forEach(function (p, i) {
    if (existing.indexOf(p.titre) > -1) return;
    store.createBien(Object.assign({}, p, { actif: true, position: i + 1 }));
  });
  store.setContent({ _import_catalogue_v1: '1' });
  console.log('Catalogue import\u00e9 : ' + projets.length + ' projets.');
})();

// Photos réelles du client (rendus 3D + photoshoot) : répartition v1.
(function assignClientPhotosV1() {
  if (store.getContentValue('_photos_v2')) return;
  var G = function (n) { return '/img/gallery/photo-' + String(n).padStart(3, '0') + '.jpg'; };

  // Pool de photos (hors photo d'accueil) : 12 rendus intérieurs + 4 extérieurs + 60 photos réelles = 76.
  var pool = [2, 3, 17].concat(
    Array.from({ length: 12 }, function (_, i) { return i + 4; }),   // 4..15 (rendus intérieurs)
    Array.from({ length: 60 }, function (_, i) { return i + 18; })   // 18..77 (photos réelles)
  );

  var titres = [
    'Résidence Panoramique', 'Résidence Rivera', 'Résidence Lumina', 'Résidence Lumina Plus',
    'Résidence Midina Garden', 'Résidence El Makam', 'Résidence Soleil', 'Résidence Saphyr'
  ];
  var perProjet = 6;
  var idx = 0;
  titres.forEach(function (titre) {
    var b = store.allBiens().find(function (x) { return x.titre === titre; });
    if (!b) return;
    var mine = pool.slice(idx, idx + perProjet).map(G);
    idx += perProjet;
    if (!mine.length) return;
    store.updateBien(b.id, Object.assign({}, b, { photos: mine, image: mine[0] }));
  });

  // Le reste part dans la galerie générale (visible sur la page d'accueil, section Galerie).
  var reste = pool.slice(idx).map(G);
  store.setContent({ gallery_extra: JSON.stringify(reste) });

  // Galerie catégorisée (Extérieur / Intérieur) pour le carrousel de l'accueil.
  var exterieurNums = [1, 2, 3, 16, 17];
  var items = [];
  for (var n = 1; n <= 77; n++) {
    items.push({ src: G(n), cat: exterieurNums.indexOf(n) > -1 ? 'exterieur' : 'interieur' });
  }
  store.setContent({ gallery_items: JSON.stringify(items) });

  // Assigne aussi une photo à chaque typologie de chaque projet (à partir de ses propres photos).
  titres.forEach(function (titre) {
    var b = store.allBiens().find(function (x) { return x.titre === titre; });
    if (!b || !b.photos || !b.photos.length || !b.typologies || !b.typologies.length) return;
    var typos = b.typologies.map(function (t, i) {
      return Object.assign({}, t, { photo: t.photo || b.photos[i % b.photos.length] });
    });
    store.updateBien(b.id, Object.assign({}, b, { typologies: typos }));
  });

  store.setContent({ _photos_v2: '1' });
  console.log('Photos client réparties : ' + (idx) + ' en résidences, ' + reste.length + ' en galerie.');
})();

// Remplace les avantages "équipements" par les avantages à ACHETER chez Benammar (v2).
(function replaceAvantagesAchatV2() {
  if (store.getContentValue('_avantages_achat_v2')) return;
  var reels = [
    { icon: 'etoile', titre: '30 ans d\'expérience', texte: "Trois décennies d'expertise et de confiance dans la promotion immobilière à Oran.", position: 1 },
    { icon: 'securite', titre: 'Résidences sécurisées', texte: "Des programmes livrés clé en main, sécurisés et pensés pour la tranquillité des familles.", position: 2 },
    { icon: 'horloge', titre: 'Délais respectés', texte: "Un engagement de livraison tenu, pour investir en toute confiance.", position: 3 },
    { icon: 'credit', titre: 'Facilités de paiement', texte: "Des modalités adaptées, avec possibilité de crédit bancaire selon les programmes.", position: 4 },
    { icon: 'accompagnement', titre: 'Accompagnement personnalisé', texte: "Une équipe dédiée vous accompagne, du choix du logement jusqu'à la remise des clés.", position: 5 },
    { icon: 'maison', titre: 'Emplacements stratégiques', texte: "Des adresses recherchées à Oran, pensées pour la qualité de vie et la valorisation de votre bien.", position: 6 },
    { icon: 'cle', titre: 'Livraison clé en main', texte: "Des logements livrés prêts à vivre, sans mauvaise surprise.", position: 7 },
    { icon: 'soleil', titre: 'Un art de vivre', texte: "Espaces verts, sécurité et équipements premium : des résidences pensées pour le confort au quotidien.", position: 8 }
  ];
  store.allAvantages().forEach(function (a) { store.deleteAvantage(a.id); });
  reels.forEach(function (a) { store.createAvantage(Object.assign({}, a, { actif: true })); });
  store.setContent({ _avantages_achat_v2: '1' });
  console.log('Avantages remplacés par les avantages à acheter chez Benammar.');
})();

// Mise à jour photos v2 : 19 nouvelles photos réelles pour Résidence Soleil (remplace l'assignation aléatoire).
(function updateSoleilPhotosV1() {
  if (store.getContentValue('_soleil_photos_v1')) return;
  var photos = [];
  for (var n = 78; n <= 96; n++) { photos.push('/img/gallery/photo-' + String(n).padStart(3, '0') + '.jpg'); }
  var b = store.allBiens().find(function (x) { return x.titre === 'Résidence Soleil'; });
  if (b) {
    var typos = (b.typologies || []).map(function (t, i) {
      return Object.assign({}, t, { photo: photos[i % photos.length] });
    });
    store.updateBien(b.id, Object.assign({}, b, { photos: photos, image: photos[0], typologies: typos }));
  }
  store.setContent({ _soleil_photos_v1: '1' });
  console.log('Résidence Soleil : ' + photos.length + ' vraies photos assignées.');
})();

// =====================================================================
// PHOTOS DE COUVERTURE (extérieur du bâtiment) — v3
// IMPORTANT : ce bloc doit rester en TOUT DERNIER dans ce fichier,
// après l'import du catalogue, sinon les résidences n'existent pas encore.
// =====================================================================
(function coverPhotosV3() {
  if (store.getContentValue('_cover_v3')) return;

  var covers = {
    'Résidence Panoramique':   '/img/gallery/res-panoramique.jpg',
    'Résidence Midina Garden': '/img/gallery/res-midina.jpg',
    'Résidence El Makam':      '/img/gallery/res-el-makam.jpg',
    'Résidence Lumina':        '/img/gallery/res-lumina.jpg',
    'Résidence Lumina Plus':   '/img/gallery/res-lumina-plus.jpg',
    'Résidence Rivera':        '/img/gallery/res-rivera.jpg',
    'Résidence Soleil':        '/img/gallery/res-soleil.jpg'
  };

  // Comparaison insensible aux accents / majuscules / espaces
  function norm(s) {
    return String(s || '').toLowerCase().normalize('NFD')
      .replace(/[\u0300-\u036f]/g, '').replace(/\s+/g, ' ').trim();
  }

  var n = 0;
  Object.keys(covers).forEach(function (titre) {
    var img = covers[titre];
    var b = store.allBiens().find(function (x) { return norm(x.titre) === norm(titre); });
    if (!b) { console.log('  ! introuvable : ' + titre); return; }

    // La photo de couverture passe aussi en 1re position de la galerie du bien
    var photos = [img].concat((b.photos || []).filter(function (p) { return p !== img; }));

    store.updateBien(b.id, Object.assign({}, b, { image: img, photos: photos }));
    console.log('  > ' + b.titre + ' -> ' + img);
    n++;
  });

  store.setContent({ _cover_v3: '1' });
  console.log('Photos de couverture appliquees : ' + n + '/7');
})();

// =====================================================================
// v4 — Panoramique HD, photos d'interieur, typologies en interieur,
//      villas reelles, localisations exactes, galerie completee.
// Doit rester en DERNIER dans ce fichier.
// =====================================================================
(function updateV4() {
  if (store.getContentValue('_maj_v4')) return;

  var G = function (n) { return '/img/gallery/photo-' + String(n).padStart(3, '0') + '.jpg'; };
  // 004 a 015 = les 12 rendus d'interieur (cf. commentaire du pool plus haut)
  var INT = []; for (var i = 4; i <= 15; i++) INT.push(G(i));

  function norm(s) {
    return String(s || '').toLowerCase().normalize('NFD')
      .replace(/[\u0300-\u036f]/g, '').replace(/\s+/g, ' ').trim();
  }
  function find(titre) {
    return store.allBiens().find(function (x) { return norm(x.titre) === norm(titre); });
  }
  // Distribue les interieurs sans repeter deux fois de suite
  function interieurs(offset, n) {
    var out = [];
    for (var k = 0; k < n; k++) out.push(INT[(offset + k) % INT.length]);
    return out;
  }

  var plan = [
    { titre: 'Résidence Panoramique',   cover: '/img/gallery/res-panoramique.jpg', off: 0,
      adresse: 'Résidence Panoramique — Gambetta, Oran, Algérie',
      map: '35.7137777,-0.6145886' },
    { titre: 'Résidence Rivera',        cover: '/img/gallery/res-rivera.jpg',      off: 6 },
    { titre: 'Résidence Lumina',        cover: '/img/gallery/res-lumina.jpg',      off: 2,
      adresse: 'Résidence Cristal Lumina — Belgaid, Oran, Algérie',
      map: '35.760094,-0.5328996' },
    { titre: 'Résidence Lumina Plus',   cover: '/img/gallery/res-lumina-plus.jpg', off: 8,
      adresse: 'Résidence Cristal Lumina — Belgaid, Oran, Algérie',
      map: '35.760094,-0.5328996' },
    { titre: 'Résidence Midina Garden', cover: '/img/gallery/res-midina.jpg',      off: 4,
      adresse: 'Résidence Medina Garden — Rue Amouri Mohamed, Oran, Algérie',
      map: '35.6713375,-0.6456719' },
    { titre: 'Résidence El Makam',      cover: '/img/gallery/res-el-makam.jpg',    off: 10 },
    // Villas : photo reelle de leurs villas en couverture
    { titre: 'Résidence Soleil',        cover: '/img/gallery/res-villas.jpg',       off: 1, villa: true },
    { titre: 'Résidence Saphyr',        cover: '/img/gallery/res-villas.jpg',       off: 7, villa: true }
  ];

  var n = 0;
  plan.forEach(function (p) {
    var b = find(p.titre);
    if (!b) { console.log('  ! introuvable : ' + p.titre); return; }

    // Galerie du bien : exterieur en 1er, puis des interieurs
    var suite = p.villa
      ? (b.photos || []).filter(function (x) { return x !== p.cover; }).slice(0, 8)
      : interieurs(p.off, 6);
    var photos = [p.cover].concat(suite.filter(function (x) { return x !== p.cover; }));

    // Typologies : photos d'interieur
    var typos = (b.typologies || []).map(function (t, i) {
      return Object.assign({}, t, { photo: p.villa ? (photos[(i + 1) % photos.length] || p.cover)
                                                   : INT[(p.off + i) % INT.length] });
    });

    var patch = Object.assign({}, b, { image: p.cover, photos: photos, typologies: typos });
    if (p.adresse) patch.adresse = p.adresse;
    if (p.map) patch.map_query = p.map;

    store.updateBien(b.id, patch);
    console.log('  > ' + b.titre + ' : couverture + ' + (photos.length - 1) + ' photos, '
      + typos.length + ' typologies' + (p.map ? ', carte OK' : ''));
    n++;
  });

  // ---- Galerie de l'accueil : on ajoute les nouvelles photos ----
  var items = [];
  try { items = JSON.parse(store.getContentValue('gallery_items') || '[]'); } catch (e) { items = []; }
  var nouvelles = [
    { src: '/img/gallery/res-panoramique.jpg', cat: 'exterieur' },
    { src: '/img/gallery/res-rivera.jpg',      cat: 'exterieur' },
    { src: '/img/gallery/res-lumina.jpg',      cat: 'exterieur' },
    { src: '/img/gallery/res-lumina-plus.jpg', cat: 'exterieur' },
    { src: '/img/gallery/res-midina.jpg',      cat: 'exterieur' },
    { src: '/img/gallery/res-el-makam.jpg',    cat: 'exterieur' },
    { src: '/img/gallery/res-villas.jpg',      cat: 'exterieur' },
    { src: '/img/gallery/res-soleil.jpg',      cat: 'exterieur' }
  ];
  INT.forEach(function (s) { nouvelles.push({ src: s, cat: 'interieur' }); });

  var vus = {};
  var fusion = [];
  nouvelles.concat(items).forEach(function (it) {
    if (!it || !it.src || vus[it.src]) return;
    vus[it.src] = 1; fusion.push(it);
  });
  store.setContent({ gallery_items: JSON.stringify(fusion) });

  store.setContent({ _maj_v4: '1' });
  console.log('Mise a jour v4 : ' + n + '/8 residences, galerie = ' + fusion.length + ' photos.');
})();

// =====================================================================
// v5 — Vraies photos de villas : Soleil et Saphyr distinctes.
// Doit rester en DERNIER dans ce fichier.
// =====================================================================
(function updateV5() {
  if (store.getContentValue('_maj_v5')) return;

  var ANCIENNE = '/img/gallery/res-villas.jpg'; // retiree (filigrane)
  var covers = {
    'Résidence Soleil': '/img/gallery/res-soleil.jpg',
    'Résidence Saphyr': '/img/gallery/res-saphyr.jpg'
  };

  function norm(s) {
    return String(s || '').toLowerCase().normalize('NFD')
      .replace(/[\u0300-\u036f]/g, '').replace(/\s+/g, ' ').trim();
  }

  Object.keys(covers).forEach(function (titre) {
    var img = covers[titre];
    var b = store.allBiens().find(function (x) { return norm(x.titre) === norm(titre); });
    if (!b) { console.log('  ! introuvable : ' + titre); return; }

    // On purge l'ancienne photo et on remet la couverture en tete
    var suite = (b.photos || []).filter(function (p) { return p !== ANCIENNE && p !== img; });
    var photos = [img].concat(suite);

    var typos = (b.typologies || []).map(function (t, i) {
      var ph = (t.photo === ANCIENNE || !t.photo) ? (photos[(i + 1) % photos.length] || img) : t.photo;
      return Object.assign({}, t, { photo: ph });
    });

    store.updateBien(b.id, Object.assign({}, b, { image: img, photos: photos, typologies: typos }));
    console.log('  > ' + b.titre + ' -> ' + img + ' (' + photos.length + ' photos)');
  });

  // Galerie : on retire l'ancienne photo et on ajoute Saphyr
  var items = [];
  try { items = JSON.parse(store.getContentValue('gallery_items') || '[]'); } catch (e) { items = []; }
  items = items.filter(function (it) { return it && it.src && it.src !== ANCIENNE; });
  var vus = {}; items.forEach(function (it) { vus[it.src] = 1; });
  [['/img/gallery/res-soleil.jpg', 'exterieur'], ['/img/gallery/res-saphyr.jpg', 'exterieur']]
    .forEach(function (p) { if (!vus[p[0]]) { items.unshift({ src: p[0], cat: p[1] }); vus[p[0]] = 1; } });
  store.setContent({ gallery_items: JSON.stringify(items) });

  store.setContent({ _maj_v5: '1' });
  console.log('Mise a jour v5 : villas OK, galerie = ' + items.length + ' photos.');
})();

// =====================================================================
// v6 — Panoramique (nouveau rendu), Soleil (rue de villas),
//      Saphyr (villa au crepuscule, sans filigrane).
// Nouveaux noms de fichiers => aucun probleme de cache navigateur.
// Doit rester en DERNIER dans ce fichier.
// =====================================================================
(function updateV6() {
  if (store.getContentValue('_maj_v6')) return;

  var remplace = {
    '/img/gallery/res-panoramique.jpg': '/img/gallery/res-panoramique-hd.jpg',
    '/img/gallery/res-soleil.jpg':      '/img/gallery/res-soleil-hd.jpg',
    '/img/gallery/res-saphyr.jpg':      '/img/gallery/res-saphyr-hd.jpg'
  };
  var maj = function (p) { return remplace[p] || p; };

  var covers = {
    'Résidence Panoramique': '/img/gallery/res-panoramique-hd.jpg',
    'Résidence Soleil':      '/img/gallery/res-soleil-hd.jpg',
    'Résidence Saphyr':      '/img/gallery/res-saphyr-hd.jpg'
  };

  function norm(s) {
    return String(s || '').toLowerCase().normalize('NFD')
      .replace(/[\u0300-\u036f]/g, '').replace(/\s+/g, ' ').trim();
  }

  // 1) Les 3 biens concernes : couverture + galerie + typologies
  Object.keys(covers).forEach(function (titre) {
    var img = covers[titre];
    var b = store.allBiens().find(function (x) { return norm(x.titre) === norm(titre); });
    if (!b) { console.log('  ! introuvable : ' + titre); return; }

    var suite = (b.photos || []).map(maj).filter(function (p) { return p !== img; });
    var photos = [img].concat(suite);
    var typos = (b.typologies || []).map(function (t) {
      return Object.assign({}, t, { photo: maj(t.photo) });
    });

    store.updateBien(b.id, Object.assign({}, b, { image: img, photos: photos, typologies: typos }));
    console.log('  > ' + b.titre + ' -> ' + img);
  });

  // 2) Securite : plus aucune reference aux anciens fichiers ailleurs
  store.allBiens().forEach(function (b) {
    var img = maj(b.image);
    var photos = (b.photos || []).map(maj);
    var typos = (b.typologies || []).map(function (t) {
      return Object.assign({}, t, { photo: maj(t.photo) });
    });
    if (img !== b.image || JSON.stringify(photos) !== JSON.stringify(b.photos || [])) {
      store.updateBien(b.id, Object.assign({}, b, { image: img, photos: photos, typologies: typos }));
    }
  });

  // 3) Galerie de l'accueil
  var items = [];
  try { items = JSON.parse(store.getContentValue('gallery_items') || '[]'); } catch (e) { items = []; }
  var vus = {}, out = [];
  items.forEach(function (it) {
    if (!it || !it.src) return;
    var s = maj(it.src);
    if (vus[s]) return;
    vus[s] = 1; out.push({ src: s, cat: it.cat || 'exterieur' });
  });
  store.setContent({ gallery_items: JSON.stringify(out) });

  store.setContent({ _maj_v6: '1' });
  console.log('Mise a jour v6 OK, galerie = ' + out.length + ' photos.');
})();

// =====================================================================
// v7 — Retrait de la villa au crepuscule de la galerie d'accueil.
// Elle reste la photo de couverture de la Residence Saphyr.
// Doit rester en DERNIER dans ce fichier.
// =====================================================================
(function updateV7() {
  if (store.getContentValue('_maj_v7')) return;

  var RETIRER = ['/img/gallery/res-saphyr-hd.jpg'];

  var items = [];
  try { items = JSON.parse(store.getContentValue('gallery_items') || '[]'); } catch (e) { items = []; }
  var avant = items.length;
  items = items.filter(function (it) {
    return it && it.src && RETIRER.indexOf(it.src) === -1;
  });
  store.setContent({ gallery_items: JSON.stringify(items) });

  store.setContent({ _maj_v7: '1' });
  console.log('Mise a jour v7 : galerie ' + avant + ' -> ' + items.length + ' photos.');
})();

// =====================================================================
// v7b — Securite des comptes admin (remise du site au client)
// seedAdmin() ne cree un compte que s'il n'existe pas : sans ce bloc,
// le compte par defaut admin@site.fr / admin1234 resterait actif meme
// apres avoir renseigne ADMIN_EMAIL dans le .env.
// =====================================================================
(function comptesAdmin() {
  var DEFAUT_EMAIL = 'admin@site.fr';
  var DEFAUT_PWD = 'admin1234';
  var email = String(process.env.ADMIN_EMAIL || DEFAUT_EMAIL).trim().toLowerCase();

  // 1) Reinitialisation ponctuelle du mot de passe depuis le .env.
  //    A utiliser seulement en cas d'oubli, puis remettre la valeur a 0.
  if (process.env.ADMIN_PASSWORD_RESET === '1' && process.env.ADMIN_PASSWORD) {
    if (store.getUserByEmail(email)) {
      store.setUserPassword(email, bcrypt.hashSync(process.env.ADMIN_PASSWORD, 10));
      console.log('Mot de passe reinitialise pour ' + email
        + ' — repassez ADMIN_PASSWORD_RESET a 0 puis redemarrez.');
    }
  }

  // 2) Un vrai compte proprietaire existe => on supprime le compte par defaut.
  if (email !== DEFAUT_EMAIL && store.getUserByEmail(email) && store.getUserByEmail(DEFAUT_EMAIL)) {
    store.deleteUser(DEFAUT_EMAIL);
    console.log('Compte de demonstration ' + DEFAUT_EMAIL + ' supprime.');
  }

  // 3) Alerte si le mot de passe d'usine est encore actif.
  var u = store.getUserByEmail(email);
  if (u && bcrypt.compareSync(DEFAUT_PWD, u.password_hash)) {
    console.log('\n  ATTENTION : le compte ' + email + ' utilise encore le mot de passe par defaut.');
    console.log('  Connectez-vous puis changez-le dans Admin > Mon compte.\n');
  }
})();
