// app/bereal-data.jsx — Données seed + helpers temps pour la feature Paparazzi
// Stockage localStorage : ea-app:bereal:* (cf. spec Feature 3)

// ─── Clés localStorage ───────────────────────────────────────────────────
const BR_PROMPTS_KEY   = "ea-app:bereal:prompts";
const BR_POSTS_KEY     = "ea-app:bereal:posts";
const BR_MYPOSTS_KEY   = "ea-app:bereal:my-posts";
const BR_NAME_KEY      = "ea-app:bereal:name";
const BR_FIRST_VISIT   = "ea-app:bereal:first-visit-done";
const BR_FIRST_POST    = "ea-app:bereal:first-post-done";
const BR_LAST_SEEN_FERM = "ea-app:bereal:last-fermeture-seen";
const BR_HOME_BANNER_DISMISSED = "ea-app:bereal:home-banner-dismissed";

// Dates jour J — la feature est en pause du 20 au 22 août 2027 inclus
const BR_PAUSE_START = "2027-08-20";
const BR_PAUSE_END   = "2027-08-22";

// ─── Prompts seed (proposés par le couple, à éditer plus tard) ───────────
const DEFAULT_PROMPTS_SEED = [
  { id: "seed-1", numero: 1, type: "seed",
    question: "Ta première réaction quand tu as reçu le faire-part.",
    sous_texte: "Capture d'écran de ton message, photo de ton sourire, mug de café — on prend tout." },
  { id: "seed-2", numero: 2, type: "seed",
    question: "Le plat que tu as hâte de manger.",
    sous_texte: "Pour mettre l'eau à la bouche de tout le monde. Indice : il y aura un tiramisu géant." },
  { id: "seed-3", numero: 3, type: "seed",
    question: "Ta tenue choisie.",
    sous_texte: "Selfie miroir, photo posée sur le lit, vue éclair du dressing — on prend ce qui vient." },
  { id: "seed-4", numero: 4, type: "seed",
    question: "Ta route vers Tabanac.",
    sous_texte: "Vue de la voiture, ticket de train, paysage de la fenêtre. À partir du J-3." },
  { id: "seed-5", numero: 5, type: "seed",
    question: "Ton fun fact préféré sur Enora ou Antoine.",
    sous_texte: "À écrire en légende. Photo libre. On garde les plus belles pour le Carnet." },
  { id: "seed-6", numero: 6, type: "seed",
    question: "Ta meilleure photo de mariage déjà vu.",
    sous_texte: "Pas le tien — celui d'un proche, d'une époque ancienne, d'un cliché familial." },
];

// ─── Banque de secours (auto-bascule si oubli du couple) ─────────────────
const DEFAULT_BACKUP_PROMPTS = [
  { id: "bk-1",  question: "Le ciel qu'il fait chez toi maintenant.", sous_texte: "Levez les yeux. Marche toute l'année." },
  { id: "bk-2",  question: "Une chanson qui te met de bonne humeur.", sous_texte: "Capture d'écran Spotify, vinyle, partition. Le titre en légende." },
  { id: "bk-3",  question: "Ce que tu vois en ce moment précis.", sous_texte: "L'ultime BeReal authentique. Pas de mise en scène, pas de filtre." },
  { id: "bk-4",  question: "Un objet que tu aimes.", sous_texte: "N'importe lequel, sans contexte. Devine pourquoi en légende." },
  { id: "bk-5",  question: "Ton petit-déjeuner du matin.", sous_texte: "Toast, smoothie, espresso à la machine — la matinée brute." },
  { id: "bk-6",  question: "Ton coin préféré chez toi.", sous_texte: "Là où tu te poses, te caches, lis, dors. On veut voir." },
  { id: "bk-7",  question: "Le dernier livre que tu as commencé.", sous_texte: "Pas forcément fini. La couverture suffit." },
  { id: "bk-8",  question: "Une vue depuis ta fenêtre.", sous_texte: "Ce que tu regardes quand tu réfléchis." },
  { id: "bk-9",  question: "Ta paire de chaussures du moment.", sous_texte: "Celles qui te portent partout. Histoire en légende." },
  { id: "bk-10", question: "Une photo que tu n'as jamais montrée.", sous_texte: "Sors un truc oublié de la pellicule. À toi de choisir l'audace." },
];

// ─── Prompt secret Phila (Club Phila — débloqué au 5e post) ──────────────
const PHILA_SECRET_PROMPT = {
  id: "phila-secret",
  numero: 0,
  type: "phila",
  question: "Montre-moi le tien.",
  sous_texte: "Ton chat, ton chien, ta plante préférée. Phila veut voir. Réservé aux membres du Club.",
};

// ─── Helpers temps ────────────────────────────────────────────────────────
function brGetWeekRange(date) {
  const d = new Date(date);
  const day = d.getDay() || 7; // Sun=0 → 7
  const monday = new Date(d);
  monday.setDate(d.getDate() - day + 1);
  monday.setHours(0, 0, 0, 0);
  const sunday = new Date(monday);
  sunday.setDate(monday.getDate() + 6);
  sunday.setHours(23, 59, 59, 999);
  return { start: monday, end: sunday };
}

function brIsPauseDay(date = new Date()) {
  const d = new Date(date);
  const iso = d.toISOString().slice(0, 10);
  return iso >= BR_PAUSE_START && iso <= BR_PAUSE_END;
}

function brFormatRange(prompt) {
  if (!prompt?.publie_le) return "";
  const start = new Date(prompt.publie_le);
  const end = new Date(prompt.ferme_le);
  const opts = { day: "numeric", month: "short" };
  const s = start.toLocaleDateString("fr-FR", opts).replace(".", "");
  const e = end.toLocaleDateString("fr-FR", opts).replace(".", "");
  return `${s} – ${e}`.toUpperCase();
}

// ─── Photo placeholder colors pour les mock posts ─────────────────────────
const MOCK_PHOTO_COLORS = [
  { from: "#A8C0AF", to: "#7E8F75" },    // sage
  { from: "#D9B3AC", to: "#B85A4E" },    // rouge aquarelle
  { from: "#E2D5A8", to: "#BE9A48" },    // or
  { from: "#C8B895", to: "#AB9871" },    // crème ocre
  { from: "#C9C3B3", to: "#8A8473" },    // pierre
  { from: "#B8BFCC", to: "#7E8FA3" },    // bleu doux
  { from: "#D4C2A0", to: "#A88E5D" },    // sable
  { from: "#9DAFA0", to: "#6B7F70" },    // forêt
  { from: "#E0BFB8", to: "#C99088" },    // terracotta pâle
  { from: "#BCB59E", to: "#8C8268" },    // olive grise
];

// ─── Captions mockées par prompt (pour le démo) ──────────────────────────
const MOCK_CAPTIONS = {
  "seed-1": ["j'ai pleuré direct", "appel à maman dans la foulée", "c'est validé", "déjà la valise mentale", "wahou", "rdv le 21"],
  "seed-2": ["le tiramisu, évidemment", "vu les planches → on dit oui", "j'arrive à jeun", "deuxième assiette prévue", "et le vin ?", "espérons un fromage"],
  "seed-3": ["finalement ce sera vert", "essayage n°4", "robe d'occasion", "costume bleu, classique", "trouvée en solde", "je vais en perdre la tête"],
  "seed-4": ["depuis Toulouse 1h30", "TGV puis bus", "covoiturage avec les cousins", "vue de la fenêtre", "Bordeaux puis voiture", "GPS dit J-2"],
  "seed-5": ["Antoine cuisine mieux qu'on croit", "Enora ronfle un peu", "ils dansent toujours en cuisine", "ils se sont rencontrés en prépa Fermat", "Phila les surveille", "il pleure aux films Disney"],
  "seed-6": ["mariage de mes grands-parents 1953", "tata Renée 1978", "voisins l'été dernier", "couleur sépia famille", "années 90 cousine Marie", "carte postale de Vienne"],
};

const MOCK_BACKUP_CAPTIONS = ["pris à l'instant", "vu de ma fenêtre", "petit moment volé", "ça compte", "sans filtre", "rien à voir"];

// ─── Mock guest first names (pour les autres invités virtuels) ───────────
const MOCK_GUEST_NAMES = [
  "Camille", "Sophie", "Mathieu", "Léa", "Jules", "Marie",
  "Pierre", "Hugo", "Anna", "Manon", "Inès", "Théo",
  "Sandrine", "Yann", "François", "Caroline", "Lucas", "Amandine",
];

// ─── Seed initial (lancé une seule fois au premier accès) ────────────────
function brSeedPrompts() {
  if (Store.get(BR_PROMPTS_KEY)?.length) return;
  const now = new Date();
  const { start: thisMonday } = brGetWeekRange(now);

  // 4 archives + 1 actif + 1 futur = 6 prompts placés autour de "maintenant"
  // Index 0..3 = archives (semaines -4 à -1), 4 = actif, 5 = futur (+1)
  const prompts = DEFAULT_PROMPTS_SEED.map((p, i) => {
    const weekOffset = i - 4;
    const monday = new Date(thisMonday);
    monday.setDate(thisMonday.getDate() + weekOffset * 7);
    const sunday = new Date(monday);
    sunday.setDate(monday.getDate() + 6);
    sunday.setHours(23, 59, 59, 999);
    return {
      ...p,
      publie_le: monday.toISOString(),
      ferme_le:  sunday.toISOString(),
      statut: weekOffset < 0 ? "archive" : weekOffset === 0 ? "actif" : "planifie",
    };
  });
  Store.set(BR_PROMPTS_KEY, prompts);
}

function brSeedMockPosts() {
  if (Store.get(BR_POSTS_KEY)?.length) return;
  const prompts = Store.get(BR_PROMPTS_KEY, []);
  const posts = [];
  const usedNames = new Set();

  prompts.forEach((p, pi) => {
    if (p.statut === "planifie") return; // pas de mock sur les futurs
    const isActive = p.statut === "actif";
    const count = isActive ? 5 : 7;
    const captions = MOCK_CAPTIONS[p.id] || MOCK_BACKUP_CAPTIONS;
    const pool = [...MOCK_GUEST_NAMES].sort(() => Math.random() - 0.5);

    for (let i = 0; i < count; i++) {
      const name = pool[i % pool.length];
      const color = MOCK_PHOTO_COLORS[(pi * 3 + i) % MOCK_PHOTO_COLORS.length];
      // Distribute timestamps within the prompt's week
      const start = new Date(p.publie_le).getTime();
      const end = Math.min(new Date(p.ferme_le).getTime(), Date.now());
      const at = new Date(start + ((i + 1) / (count + 1)) * (end - start));
      posts.push({
        id: `mock-${p.id}-${i}`,
        prompt_id: p.id,
        nom_invite: name,
        photo_color: color,
        photo_url: null,
        caption: captions[i % captions.length] || "",
        publie_le: at.toISOString(),
        statut: "publie",
        mock: true,
      });
    }
  });
  Store.set(BR_POSTS_KEY, posts);
}

// ─── Getters ──────────────────────────────────────────────────────────────
function brGetPrompts() { return Store.get(BR_PROMPTS_KEY, []); }
function brGetPosts() { return Store.get(BR_POSTS_KEY, []); }
function brGetMyPostIds() { return Store.get(BR_MYPOSTS_KEY, []); }

function brGetActivePrompt() {
  const now = Date.now();
  return brGetPrompts().find(p =>
    new Date(p.publie_le).getTime() <= now &&
    new Date(p.ferme_le).getTime() >= now
  ) || null;
}

function brGetArchivedPrompts() {
  const now = Date.now();
  return brGetPrompts()
    .filter(p => new Date(p.ferme_le).getTime() < now)
    .sort((a, b) => new Date(b.publie_le) - new Date(a.publie_le));
}

function brGetPostsForPrompt(promptId) {
  return brGetPosts()
    .filter(p => p.prompt_id === promptId && p.statut === "publie")
    .sort((a, b) => new Date(b.publie_le) - new Date(a.publie_le));
}

function brMyPostForPrompt(promptId) {
  const myIds = brGetMyPostIds();
  return brGetPosts().find(p => p.prompt_id === promptId && myIds.includes(p.id)) || null;
}

function brMyPostsCount() {
  const myIds = brGetMyPostIds();
  return brGetPosts().filter(p => myIds.includes(p.id) && p.statut === "publie" && p.prompt_id !== "phila-secret").length;
}

function brIsClubPhila() { return brMyPostsCount() >= 5; }

// ─── Rappel + bascule auto sur prompt de secours ──────────────────────────
// Si plus de 7 jours sans nouveau prompt actif → bascule sur le prochain
// prompt de la banque de secours non encore utilisé.
function brCheckBackupTrigger() {
  const prompts = brGetPrompts();
  const lastFermeture = prompts
    .map(p => new Date(p.ferme_le).getTime())
    .reduce((m, t) => Math.max(m, t), 0);
  const now = Date.now();
  const daysSince = (now - lastFermeture) / 86400000;
  if (daysSince <= 7) return false; // pas encore le moment

  // Trouver un prompt de secours pas encore utilisé
  const usedIds = new Set(prompts.map(p => p.id));
  const fresh = DEFAULT_BACKUP_PROMPTS.find(b => !usedIds.has(b.id));
  if (!fresh) return false;

  const { start, end } = brGetWeekRange(new Date());
  const newPrompt = {
    ...fresh,
    numero: prompts.length + 1,
    type: "secours",
    publie_le: start.toISOString(),
    ferme_le:  end.toISOString(),
    statut: "actif",
  };
  Store.set(BR_PROMPTS_KEY, [...prompts, newPrompt]);
  return true;
}

// ─── Saver ────────────────────────────────────────────────────────────────
function brSavePost(post) {
  const all = brGetPosts();
  all.push(post);
  Store.set(BR_POSTS_KEY, all);
  const myIds = brGetMyPostIds();
  Store.set(BR_MYPOSTS_KEY, [...myIds, post.id]);
}

function brRemovePost(postId) {
  const all = brGetPosts().map(p => p.id === postId ? { ...p, statut: "retire" } : p);
  Store.set(BR_POSTS_KEY, all);
}

function brAddPrompt(newP) {
  const all = brGetPrompts();
  all.push(newP);
  Store.set(BR_PROMPTS_KEY, all);
}

function brUpdatePrompt(id, patch) {
  const all = brGetPrompts().map(p => p.id === id ? { ...p, ...patch } : p);
  Store.set(BR_PROMPTS_KEY, all);
}

function brDeletePrompt(id) {
  Store.set(BR_PROMPTS_KEY, brGetPrompts().filter(p => p.id !== id));
}

// ─── Init seed au chargement (idempotent) ─────────────────────────────────
if (typeof window !== "undefined" && typeof Store !== "undefined") {
  brSeedPrompts();
  brSeedMockPosts();
}

Object.assign(window, {
  BR_PROMPTS_KEY, BR_POSTS_KEY, BR_MYPOSTS_KEY, BR_NAME_KEY,
  BR_FIRST_VISIT, BR_FIRST_POST, BR_LAST_SEEN_FERM, BR_HOME_BANNER_DISMISSED,
  BR_PAUSE_START, BR_PAUSE_END,
  DEFAULT_PROMPTS_SEED, DEFAULT_BACKUP_PROMPTS, PHILA_SECRET_PROMPT,
  MOCK_PHOTO_COLORS, MOCK_GUEST_NAMES,
  brGetWeekRange, brIsPauseDay, brFormatRange,
  brSeedPrompts, brSeedMockPosts,
  brGetPrompts, brGetPosts, brGetMyPostIds,
  brGetActivePrompt, brGetArchivedPrompts, brGetPostsForPrompt,
  brMyPostForPrompt, brMyPostsCount, brIsClubPhila,
  brCheckBackupTrigger,
  brSavePost, brRemovePost,
  brAddPrompt, brUpdatePrompt, brDeletePrompt,
});
