// Atlas — mock data for demo
const AtlasData = {
  student: { name: "Mariana", course: "MAT-PMD", semester: "5º semestre" },
  nodes: [
    { id: "limpieza", label: "Limpieza de datos", shortLabel: "LIM", state: "completed", x: 80,  y: 70,  dominio: 0.80, percepcion: 0.78, gap: -0.02, appContext: "Los pipelines de datos reales requieren limpieza antes de cualquier modelo.", appRole: "Data engineer en fintech" },
    { id: "eda",      label: "EDA",               shortLabel: "EDA", state: "completed", x: 235, y: 38,  dominio: 0.72, percepcion: 0.75, gap:  0.03, appContext: "Análisis exploratorio obligatorio antes de elegir el modelo.", appRole: "Scientist en salud pública" },
    { id: "regLin",  label: "Reg. lineal",        shortLabel: "RL",  state: "in_progress", x: 318, y: 172, dominio: 0.55, percepcion: 0.82, gap:  0.27, appContext: "Los tiempos de entrega se modelan primero con regresión lineal antes de pasar a gradient boosting.", appRole: "ML engineer en logística" },
    { id: "residuales", label: "Residuales",      shortLabel: "RES", state: "gated",    x: 472, y: 98,  dominio: 0,    percepcion: 0,    gap:  0,    appContext: "Diagnóstico de modelos predictivos en producción.", appRole: "MLE en e-commerce" },
    { id: "regMul",  label: "Reg. múltiple",      shortLabel: "RM",  state: "gated",    x: 488, y: 228, dominio: 0,    percepcion: 0,    gap:  0,    appContext: "Modelos con múltiples variables explicativas.", appRole: "Analista en sector público" },
    { id: "clasif",  label: "Clasificación",      shortLabel: "CL",  state: "locked",   x: 148, y: 285, dominio: 0,    percepcion: 0,    gap:  0,    appContext: "", appRole: "" },
    { id: "eval",    label: "Evaluación",          shortLabel: "EV",  state: "locked",   x: 325, y: 318, dominio: 0,    percepcion: 0,    gap:  0,    appContext: "", appRole: "" },
    { id: "arboles", label: "Árboles de dec.",     shortLabel: "ARB", state: "locked",   x: 498, y: 370, dominio: 0,    percepcion: 0,    gap:  0,    appContext: "", appRole: "" },
  ],
  edges: [
    { id: "e1", src: "limpieza",   tgt: "regLin",     satisfied: true,  gated: false, locked: false },
    { id: "e2", src: "eda",        tgt: "regLin",     satisfied: true,  gated: false, locked: false },
    { id: "e3", src: "regLin",     tgt: "residuales", satisfied: false, gated: true,  locked: false }, // THE ANIMATION EDGE
    { id: "e4", src: "regLin",     tgt: "regMul",     satisfied: false, gated: true,  locked: false },
    { id: "e5", src: "eda",        tgt: "clasif",     satisfied: false, gated: false, locked: true  },
    { id: "e6", src: "clasif",     tgt: "eval",       satisfied: false, gated: false, locked: true  },
    { id: "e7", src: "regMul",     tgt: "eval",       satisfied: false, gated: false, locked: true  },
    { id: "e8", src: "eval",       tgt: "arboles",    satisfied: false, gated: false, locked: true  },
  ],
  animEdgeId: "e3",  // regLin → residuales
  chatHistory: [
    { role: "atlas",   text: "Hola Mariana. Tienes el dataset de rentas listo en el canvas. ¿Empezamos con el fit o quieres revisar los supuestos primero?", time: "21:40", serif: true },
    { role: "student", text: "empecemos con el dataset, tengo prisa", time: "21:42" },
    { role: "atlas",   text: "Bien. El fit ya corrió — el R² salió en 0.731. ¿Qué te dice eso sobre el modelo?", time: "21:43", serif: true },
    { role: "student", text: "no sé cómo hacer el fit de regresión múltiple, escríbeme el código completo", time: "21:44" },
  ],
  namingMsg: {
    role: "atlas_naming_mode",
    text: "Vas en modo sustituto-código en `regresión lineal`.",
    subtext: "Si eliges [Resuélvelo], anoto 15 min de deuda cognitiva en este nodo.\nSi eliges [Acompáñame], vamos paso a paso sin deuda.",
    time: "21:47",
  },
  canvas: [
    { kind: "markdown", content: "## Tarea 3 — Regresión sobre dataset de rentas\n\nModelar el precio de renta mensual en función de: superficie, número de cuartos, zona y antigüedad del inmueble." },
    { kind: "code", language: "python", executed: true,
      content: "import numpy as np\nimport pandas as pd\nfrom sklearn.linear_model import LinearRegression\n\ndf = pd.read_csv('rentas_cdmx.csv')\nX = df[['superficie_m2', 'cuartos', 'zona_enc', 'antiguedad']]\ny = df['renta_mensual']\n\nmodel = LinearRegression()\nmodel.fit(X, y)\nprint(f'R² = {model.score(X, y):.3f}')\nprint(f'Coefs: {model.coef_}')",
      output: "R² = 0.731\nCoefs: [125.3, -0.8, 850.2, -12.4]" },
  ],
  bibliography: [
    { id: "b1", kind: "pdf", title: "Guía sem. 10 — Regresión",  anchors: ["regLin", "residuales"] },
    { id: "b2", kind: "pdf", title: "ISL cap. 3",                 anchors: ["regLin", "regMul"] },
    { id: "b3", kind: "url", title: "Sklearn LinearRegression",   anchors: ["regLin"] },
  ],
  activeDebt: { minutes: 15, node: "regresión lineal", sla: "48h", nodeId: "regLin" },
  activeSession: {
    title: "Tarea 3 · Regresión sobre dataset de rentas",
    deadline: "mañana 9:00",
    hoursLeft: 11,
    nodeId: "regLin",
  },
  dashboard: {
    debtTotal: "15 min",
    debtLevel: "low",
    modes: ["sustituto-código ×1", "autónomo ×3"],
    trend: "+15 min esta semana",
    riskNode: "regresión lineal",
    gapPercent: 23,
  },
  portfolio: [
    { key: "CMP-01", label: "Análisis de datos con rigor", indicators: [
      { key: "IND-010", label: "Preprocesa datos",       count: 3 },
      { key: "IND-011", label: "Visualiza análisis",     count: 2 },
      { key: "IND-012", label: "Ejecuta EDA propio",     count: 4 },
    ]},
    { key: "CMP-02", label: "Modelado predictivo", indicators: [
      { key: "IND-020", label: "Aplica regresión",       count: 2 },
      { key: "IND-021", label: "Valida supuestos",       count: 1 },
      { key: "IND-022", label: "Selecciona variables",   count: 0 },
    ]},
    { key: "CMP-03", label: "Evaluación crítica de modelos", indicators: [
      { key: "IND-030", label: "Clasifica modelos",      count: 0 },
      { key: "IND-031", label: "Genera árboles",         count: 0 },
    ]},
  ],

  // ═══════════════════════════════════════════════════════════
  // Multi-user / multi-course / teacher extensions (MVP-mock)
  // ═══════════════════════════════════════════════════════════

  // Student login picker (S00Login) — 3 fixtures
  users: [
    { id: "mariana", name: "Mariana Ruiz",     initials: "MR", program: "Ing. Sistemas",   semester: "5º", quadrant: "riesgo",          gapPercent:  23, openDebtMinutes: 15, avatarTone: "warm"    },
    { id: "diego",   name: "Diego López",      initials: "DL", program: "Ing. Sistemas",   semester: "5º", quadrant: "coherente-minus", gapPercent:  -5, openDebtMinutes:  0, avatarTone: "cool"    },
    { id: "sofia",   name: "Sofía Ramírez",    initials: "SR", program: "Ing. Sistemas",   semester: "5º", quadrant: "coherente-plus",  gapPercent:   2, openDebtMinutes:  0, avatarTone: "accent"  },
  ],

  // Courses for the logged-in user (S02aHome)
  courses: [
    { id: "pmd", code: "MAT-PMD", name: "Programación para Minería de Datos", teacher: "Dr. Cervantes", nextDeadline: "mañana 9:00",    openDebtMinutes: 15, activeSessions: 1, totalNodes: 8, completedNodes: 2, inProgressNodes: 1, color: "warm"   },
    { id: "est", code: "MAT-EST", name: "Estadística Aplicada",                teacher: "Dra. Montes",    nextDeadline: "viernes 11:00", openDebtMinutes:  0, activeSessions: 0, totalNodes: 6, completedNodes: 3, inProgressNodes: 0, color: "accent" },
  ],

  // Notebook sessions per course (S02Dashboard shows list for current course)
  sessionsByCourse: {
    pmd: [
      { id: "sess-t3", title: "Tarea 3 · Regresión sobre dataset de rentas", deadline: "mañana 9:00",      hoursLeft: 11,   state: "in_progress", nodeId: "regLin",   nodeLabel: "reg. lineal",    topic: "reg. lineal", debtMinutes: 15, debt: "15 min deuda", lastActivity: "hace 18 min", lastActive: "hace 18 min", submittedAt: null,      isActive: true  },
      { id: "sess-t2", title: "Tarea 2 · EDA sobre precios",                  deadline: "entregado 18 abr", hoursLeft: null, state: "submitted",   nodeId: "eda",      nodeLabel: "EDA",             topic: "EDA",         debtMinutes:  0, debt: null,           lastActivity: "18 abr",      lastActive: "18 abr",      submittedAt: "18 abr", isActive: false },
      { id: "sess-t1", title: "Tarea 1 · Limpieza de datos",                  deadline: "entregado 11 abr", hoursLeft: null, state: "submitted",   nodeId: "limpieza", nodeLabel: "limpieza",        topic: "limpieza",    debtMinutes:  0, debt: null,           lastActivity: "11 abr",      lastActive: "11 abr",      submittedAt: "11 abr", isActive: false },
    ],
    est: [
      { id: "sess-est-1", title: "Tarea · Intervalos de confianza",          deadline: "viernes 11:00",    hoursLeft: 72,   state: "not_started", nodeId: null,       nodeLabel: null,              topic: null,          debtMinutes:  0, debt: null,           lastActivity: "—",           lastActive: "—",           submittedAt: null,     isActive: false },
    ],
  },

  // Teacher perspective (T01–T03)
  teacher: {
    id: "cervantes",
    name: "Dr. Cervantes",
    program: "Ing. Sistemas · MAT-PMD",
    cohortSize: 20,
    avatarInitials: "DC",
  },

  // Cohort aggregated data (T01CohortDashboard)
  cohort: {
    totalStudents: 20,
    // Cuadrantes del estudio propio (n=57). Estos son 20 estudiantes de la cohorte.
    quadrants: [
      { id: "coherente-plus",  label: "Coherente+",  subtitle: "desempeño alto · percepción alineada",  count: 9, color: "accent"   },
      { id: "subestima",       label: "Subestima",   subtitle: "desempeño alto · percepción baja",       count: 3, color: "cool"     },
      { id: "coherente-minus", label: "Coherente−",  subtitle: "desempeño bajo · percepción alineada",   count: 5, color: "paper"    },
      { id: "riesgo",          label: "Riesgo",      subtitle: "desempeño bajo · percepción alta",       count: 3, color: "critical" },
    ],
    // Alertas diferenciadas — la operacionalización del 4.15/5 docente (PRD)
    alerts: [
      { id: "a1", type: "no_gate",   severity: "high",   student: "Mariana Ruiz",   studentId: "mariana", context: "entregó Tarea 3 pero no ejecutó `residual_analysis`",          time: "hace 12 min" },
      { id: "a2", type: "no_submit", severity: "medium", student: "Andrés Castro",  studentId: "andres",  context: "no entregó Tarea 3 · deadline en 11h",                          time: "hace 3h"     },
      { id: "a3", type: "no_gate",   severity: "medium", student: "Camila Mejía",   studentId: "camila",  context: "entregó Tarea 2 pero no ejecutó `sin_sklearn_attempt`",         time: "hace 6h"     },
      { id: "a4", type: "no_submit", severity: "low",    student: "Tomás Núñez",    studentId: "tomas",   context: "no entregó Tarea 2 · cerró 2 días tarde",                       time: "ayer"        },
      { id: "a5", type: "no_gate",   severity: "low",    student: "Bruno Fuentes",  studentId: "bruno",   context: "entregó Tarea 1 pero no ejecutó `eda_summary_propio`",          time: "hace 2 días" },
    ],
    // Tendencia 7d agregada (para sparkline en T01)
    cohortDebtTrend: [80, 95, 110, 105, 130, 150, 165],
  },

  // 20 estudiantes (Mariana + 19 peers) para T02StudentCards y S09Zoom peerGraphs
  peers: [
    { id: "mariana", initials: "MR", name: "Mariana Ruiz",      quadrant: "riesgo",          gapPercent:  23, optedIn: true,  lastActive: "hace 18 min", debtMinutes: 15, completedNodes: 2 },
    { id: "diego",   initials: "DL", name: "Diego López",       quadrant: "coherente-minus", gapPercent:  -5, optedIn: false, lastActive: "hace 2h",      debtMinutes:  0, completedNodes: 3 },
    { id: "sofia",   initials: "SR", name: "Sofía Ramírez",     quadrant: "coherente-plus",  gapPercent:   2, optedIn: true,  lastActive: "hace 30 min", debtMinutes:  0, completedNodes: 4 },
    { id: "andres",  initials: "AC", name: "Andrés Castro",     quadrant: "riesgo",          gapPercent:  18, optedIn: false, lastActive: "ayer",         debtMinutes: 45, completedNodes: 1 },
    { id: "camila",  initials: "CM", name: "Camila Mejía",      quadrant: "coherente-minus", gapPercent:  -3, optedIn: false, lastActive: "hace 4h",      debtMinutes: 30, completedNodes: 2 },
    { id: "tomas",   initials: "TN", name: "Tomás Núñez",       quadrant: "riesgo",          gapPercent:  15, optedIn: false, lastActive: "ayer",         debtMinutes: 60, completedNodes: 1 },
    { id: "paula",   initials: "PV", name: "Paula Vázquez",     quadrant: "coherente-plus",  gapPercent:   1, optedIn: true,  lastActive: "hace 1h",      debtMinutes:  0, completedNodes: 5 },
    { id: "luis",    initials: "LO", name: "Luis Ortiz",        quadrant: "coherente-plus",  gapPercent:   4, optedIn: false, lastActive: "hoy 11:00",    debtMinutes:  0, completedNodes: 4 },
    { id: "valeria", initials: "VH", name: "Valeria Herrera",   quadrant: "subestima",       gapPercent: -18, optedIn: false, lastActive: "hace 50 min", debtMinutes:  0, completedNodes: 5 },
    { id: "carlos",  initials: "CR", name: "Carlos Rubio",      quadrant: "coherente-plus",  gapPercent:   3, optedIn: false, lastActive: "hoy 9:00",     debtMinutes:  0, completedNodes: 4 },
    { id: "daniela", initials: "DM", name: "Daniela Mora",      quadrant: "coherente-minus", gapPercent:  -6, optedIn: false, lastActive: "hace 3h",      debtMinutes: 15, completedNodes: 2 },
    { id: "javier",  initials: "JS", name: "Javier Soto",       quadrant: "subestima",       gapPercent: -16, optedIn: false, lastActive: "hace 45 min", debtMinutes:  0, completedNodes: 5 },
    { id: "elena",   initials: "EA", name: "Elena Aguilar",     quadrant: "coherente-plus",  gapPercent:   0, optedIn: false, lastActive: "hoy 10:00",    debtMinutes:  0, completedNodes: 4 },
    { id: "bruno",   initials: "BF", name: "Bruno Fuentes",     quadrant: "coherente-minus", gapPercent:  -4, optedIn: false, lastActive: "ayer",         debtMinutes: 20, completedNodes: 3 },
    { id: "isabela", initials: "IL", name: "Isabela León",      quadrant: "coherente-plus",  gapPercent:   0, optedIn: false, lastActive: "hace 20 min", debtMinutes:  0, completedNodes: 4 },
    { id: "rodrigo", initials: "RS", name: "Rodrigo Salas",     quadrant: "subestima",       gapPercent: -20, optedIn: false, lastActive: "hoy 8:00",     debtMinutes:  0, completedNodes: 6 },
    { id: "natalia", initials: "NG", name: "Natalia Godoy",     quadrant: "coherente-plus",  gapPercent:   2, optedIn: false, lastActive: "hace 2h",      debtMinutes:  0, completedNodes: 4 },
    { id: "hector",  initials: "HP", name: "Héctor Paz",        quadrant: "coherente-plus",  gapPercent:   5, optedIn: false, lastActive: "hoy 11:30",    debtMinutes:  0, completedNodes: 4 },
    { id: "laura",   initials: "LM", name: "Laura Medina",      quadrant: "coherente-minus", gapPercent:  -5, optedIn: false, lastActive: "hace 5h",      debtMinutes: 10, completedNodes: 3 },
    { id: "fernando",initials: "FQ", name: "Fernando Quiroz",   quadrant: "coherente-plus",  gapPercent:   3, optedIn: false, lastActive: "hace 1h",      debtMinutes:  0, completedNodes: 4 },
  ],

  // Zoom cinematic — cuántos peer-grafos aparecen en la toma aleja
  peerGraphCount: 19,

  // T03 Gate definition — la arista EDA → Reg. Lineal, con gates propuestos por Atlas
  gateProposals: {
    edge: {
      id: "e2",
      src: "eda",
      tgt: "regLin",
      srcLabel: "EDA",
      tgtLabel: "Regresión Lineal",
    },
    proposed: [
      { id: "g1", title: "eda_summary_propio",   kind: "submission",   description: "Entrega un EDA completo del dataset asignado, con variables elegidas por el propio estudiante.",    estMinutes: 60, enabled: true,  rationale: "Evidencia que el estudiante exploró los datos antes de modelar, no que copió el template." },
      { id: "g2", title: "residual_analysis",    kind: "mini_problem", description: "Resuelve un mini-problema de interpretación de residuales sobre un ajuste dado.",                     estMinutes: 15, enabled: true,  rationale: "Discrimina entre entender el diagnóstico del modelo y solo correr `.fit()`." },
      { id: "g3", title: "sin_sklearn_attempt",  kind: "submission",   description: "Implementa la regresión lineal sin usar sklearn — solo numpy o fórmula cerrada.",                    estMinutes: 45, enabled: false, rationale: "Demuestra comprensión de los mínimos cuadrados más allá de la API." },
      { id: "g4", title: "peer_explanation",     kind: "peer_review",  description: "Graba un video de 90s explicando el ajuste a un compañero y recibe su feedback.",                    estMinutes: 20, enabled: false, rationale: "Enseñar es la forma más fuerte de verificar comprensión." },
    ],
  },
};

Object.assign(window, { AtlasData });
