// ─────────────────────────────────────────────────────────────────
//  Account hierarchy: Organizations → Schools → Counselors
//
//  An organization is either a DISTRICT (contains schools, which contain
//  counselors) or a standalone SCHOOL (contains counselors directly).
//  Modeled with three flat tables joined by id so the same counselor
//  record rolls up cleanly at the school, district, and org level.
//
//  Admin edits (add/edit counselors, edit orgs) persist to localStorage
//  and broadcast so every open view stays in sync — same pattern as the
//  roadmap override + event stores.
// ─────────────────────────────────────────────────────────────────

const ORG_KEY = "sasa_orgs_v1";

// id helper
const oid = (p) => `${p}_${Math.random().toString(36).slice(2, 8)}`;

// ── Seed ────────────────────────────────────────────────────────────────
const ORG_SEED = {
  districts: [
    { id: "d_cascade",   name: "Cascade USD #47",       region: "Washington" },
    { id: "d_riverside", name: "Riverside Unified",      region: "California" },
  ],
  // districtId === null  →  standalone school account (Schools → Counselors)
  schools: [
    { id: "sc_westbrook",  name: "Westbrook High School",   districtId: "d_cascade" },
    { id: "sc_lincoln",    name: "Lincoln High School",     districtId: "d_cascade" },
    { id: "sc_eastwood",   name: "Eastwood High School",    districtId: "d_cascade" },
    { id: "sc_franklin",   name: "Franklin High School",    districtId: "d_cascade" },
    { id: "sc_northridge", name: "North Ridge High School", districtId: "d_cascade" },
    { id: "sc_riverside",  name: "Riverside High School",   districtId: "d_riverside" },
    { id: "sc_valley",     name: "Valley View High School", districtId: "d_riverside" },
    { id: "sc_summit",     name: "Summit Prep Academy",     districtId: null },
  ],
  // status: "active" | "invited" | "inactive"
  // engagement is per-counselor; rolls up to school + district + org.
  counselors: [
    { id: "c_kim",       name: "Rachel Kim",      email: "rachel.kim@westbrook.k12.us",     schoolId: "sc_westbrook",  status: "active",   minutesMTD: 184, minutesAllTime: 762, sessions: 5, shares: 14, downloads: 23, lastActive: "Today" },
    { id: "c_ortega",    name: "Jen Ortega",      email: "jen.ortega@westbrook.k12.us",     schoolId: "sc_westbrook",  status: "active",   minutesMTD: 142, minutesAllTime: 511, sessions: 4, shares: 9,  downloads: 17, lastActive: "3 days ago" },
    { id: "c_joshi",     name: "Priya Joshi",     email: "priya.joshi@lincoln.k12.us",      schoolId: "sc_lincoln",    status: "active",   minutesMTD: 241, minutesAllTime: 903, sessions: 6, shares: 28, downloads: 31, lastActive: "Today" },
    { id: "c_whitfield", name: "Sam Whitfield",   email: "sam.whitfield@lincoln.k12.us",    schoolId: "sc_lincoln",    status: "active",   minutesMTD: 98,  minutesAllTime: 402, sessions: 3, shares: 6,  downloads: 12, lastActive: "4 days ago" },
    { id: "c_chen",      name: "David Chen",      email: "david.chen@eastwood.k12.us",      schoolId: "sc_eastwood",   status: "active",   minutesMTD: 218, minutesAllTime: 688, sessions: 5, shares: 24, downloads: 26, lastActive: "Yesterday" },
    { id: "c_brooks",    name: "Aliyah Brooks",   email: "aliyah.brooks@franklin.k12.us",   schoolId: "sc_franklin",   status: "active",   minutesMTD: 196, minutesAllTime: 640, sessions: 5, shares: 19, downloads: 22, lastActive: "Yesterday" },
    { id: "c_delgado",   name: "Marcus Delgado",  email: "marcus.delgado@northridge.k12.us",schoolId: "sc_northridge", status: "active",   minutesMTD: 171, minutesAllTime: 559, sessions: 4, shares: 17, downloads: 20, lastActive: "2 days ago" },
    { id: "c_reyes",     name: "Carla Reyes",     email: "carla.reyes@riverside.k12.us",    schoolId: "sc_riverside",  status: "active",   minutesMTD: 133, minutesAllTime: 421, sessions: 4, shares: 11, downloads: 15, lastActive: "Yesterday" },
    { id: "c_becker",    name: "Tom Becker",      email: "tom.becker@riverside.k12.us",     schoolId: "sc_riverside",  status: "inactive", minutesMTD: 0,   minutesAllTime: 88,  sessions: 1, shares: 0,  downloads: 3,  lastActive: "38 days ago" },
    { id: "c_alvarez",   name: "Nina Alvarez",    email: "nina.alvarez@valleyview.k12.us",  schoolId: "sc_valley",     status: "active",   minutesMTD: 109, minutesAllTime: 356, sessions: 3, shares: 8,  downloads: 14, lastActive: "5 days ago" },
    { id: "c_holloway",  name: "Grace Holloway",  email: "grace.holloway@summitprep.org",   schoolId: "sc_summit",     status: "active",   minutesMTD: 205, minutesAllTime: 612, sessions: 5, shares: 21, downloads: 24, lastActive: "Today" },
    { id: "c_lin",       name: "Derek Lin",       email: "derek.lin@summitprep.org",        schoolId: "sc_summit",     status: "invited",  minutesMTD: 0,   minutesAllTime: 0,   sessions: 0, shares: 0,  downloads: 0,  lastActive: "Invite sent" },
  ],
};

const TOTAL_SESSIONS = 6; // curriculum length, used for completion %

// ── Persistence ───────────────────────────────────────────────────────────
function loadOrgs() {
  try {
    const s = JSON.parse(localStorage.getItem(ORG_KEY));
    if (s && Array.isArray(s.counselors) && Array.isArray(s.schools)) return s;
  } catch { /* fall through */ }
  const seed = JSON.parse(JSON.stringify(ORG_SEED));
  localStorage.setItem(ORG_KEY, JSON.stringify(seed));
  return seed;
}
function saveOrgs(o) {
  localStorage.setItem(ORG_KEY, JSON.stringify(o));
  window.dispatchEvent(new CustomEvent("sasa-orgs-change"));
}

// ── Mutations ───────────────────────────────────────────────────────────
function upsertCounselor(c) {
  const o = loadOrgs();
  if (c.id) {
    o.counselors = o.counselors.map(x => x.id === c.id ? { ...x, ...c } : x);
  } else {
    o.counselors.push({
      id: oid("c"), status: "invited",
      minutesMTD: 0, minutesAllTime: 0, sessions: 0, shares: 0, downloads: 0,
      lastActive: "Invite sent", ...c,
    });
  }
  saveOrgs(o);
}
function deleteCounselor(id) {
  const o = loadOrgs();
  o.counselors = o.counselors.filter(x => x.id !== id);
  saveOrgs(o);
}
function upsertSchool(s) {
  const o = loadOrgs();
  if (s.id && o.schools.some(x => x.id === s.id)) {
    o.schools = o.schools.map(x => x.id === s.id ? { ...x, ...s } : x);
  } else {
    o.schools.push({ id: oid("sc"), districtId: null, ...s });
  }
  saveOrgs(o);
}
function upsertDistrict(d) {
  const o = loadOrgs();
  if (d.id && o.districts.some(x => x.id === d.id)) {
    o.districts = o.districts.map(x => x.id === d.id ? { ...x, ...d } : x);
  } else {
    o.districts.push({ id: oid("d"), ...d });
  }
  saveOrgs(o);
}

// ── Derived helpers ───────────────────────────────────────────────────────
function rollup(counselors) {
  const n = counselors.length;
  const active = counselors.filter(c => c.status === "active").length;
  const minutesMTD = counselors.reduce((s, c) => s + (c.minutesMTD || 0), 0);
  const minutesAllTime = counselors.reduce((s, c) => s + (c.minutesAllTime || 0), 0);
  const shares = counselors.reduce((s, c) => s + (c.shares || 0), 0);
  const downloads = counselors.reduce((s, c) => s + (c.downloads || 0), 0);
  // avg completion counts only counselors who have started (avoids invited=0 dragging it down)
  const started = counselors.filter(c => c.status !== "invited");
  const avgCompletion = started.length
    ? Math.round(started.reduce((s, c) => s + Math.min(1, (c.sessions || 0) / TOTAL_SESSIONS), 0) / started.length * 100)
    : 0;
  return { count: n, active, minutesMTD, minutesAllTime, shares, downloads, avgCompletion };
}

// React hook — re-renders on any org change (same tab or across tabs)
function useOrgs() {
  const [o, setO] = useState(loadOrgs);
  useEffect(() => {
    const h = () => setO(loadOrgs());
    window.addEventListener("sasa-orgs-change", h);
    window.addEventListener("storage", h);
    return () => { window.removeEventListener("sasa-orgs-change", h); window.removeEventListener("storage", h); };
  }, []);
  return o;
}

// initials from a name
function initialsOf(name) {
  return (name || "?").trim().split(/\s+/).map(w => w[0]).slice(0, 2).join("").toUpperCase();
}

Object.assign(window, {
  useOrgs, loadOrgs, saveOrgs,
  upsertCounselor, deleteCounselor, upsertSchool, upsertDistrict,
  rollup, initialsOf, ORG_TOTAL_SESSIONS: TOTAL_SESSIONS,
});
