// ============================================================
// SAMPLE page — data model + localStorage + server sync
// ============================================================
const SAMPLE_KEY = 'sr_sample_v1';
const SAMPLE_APIKEY_LS = 'sr_api_key';

function sRid(p = 'id') { return `${p}_${Math.random().toString(36).slice(2, 8)}`; }

function defaultSampleConfig() {
  const M = 24, K = 6;
  const ports = (plug, led) => Array.from({ length: 2 * M }, () => ({ plug, led }));

  return {
    params: { N: 2, M, K, portMode: 'plug_led', showPortNums: false, portIconSize: 22 },
    groups: [
      {
        id: 'sg_01', tag: 'SG-01', alias: 'Server Room A',
        racks: [
          {
            id: 'sr_01_a', label: 'SG-01-A', alias: 'Primary Rack',
            media: [
              { id: 'sm_r1', name: 'Floor Overview',  type: 'image', src: '/screenshots/floor-default.png' },
              { id: 'sm_r2', name: 'Full HQ View',    type: 'image', src: '/screenshots/floor-full-hq.png' },
            ],
            slots: [
              { id: 'ss_01_a_0', kind: 'switch',  name: 'sw-web', power: 'on',  ports: ports('rj45', 'green'),
                media: [{ id: 'sm_s1', name: 'sw-web photo', type: 'image', src: '/screenshots/floor-hq.png' }] },
              { id: 'ss_01_a_1', kind: 'switch',  name: 'sw-02',  power: 'on',  ports: ports('rj45', 'green'),  media: [] },
              { id: 'ss_01_a_2', kind: 'switch',  name: 'sw-01',  power: 'on',  ports: ports('empty', 'off'),
                media: [{ id: 'sm_s2', name: 'Switch panel', type: 'image', src: '/screenshots/marked.png' }] },
              { id: 'ss_01_a_3', kind: 'server',  name: 'srv-01', power: 'on',  ports: [],                  media: [] },
              { id: 'ss_01_a_4', kind: 'empty',   name: '',       power: 'off', ports: [],                  media: [] },
              { id: 'ss_01_a_5', kind: 'empty',   name: '',       power: 'off', ports: [],                  media: [] },
            ],
          },
          {
            id: 'sr_01_b', label: 'SG-01-B', alias: '',
            media: [
              { id: 'sm_r3', name: 'Status View', type: 'image', src: '/screenshots/floor-status.png' },
            ],
            slots: [
              { id: 'ss_01_b_0', kind: 'switch', name: 'sw-db',  power: 'on',  ports: ports('rj45', 'green'),  media: [] },
              { id: 'ss_01_b_1', kind: 'server', name: 'srv-db', power: 'off', ports: [],                   media: [] },
              { id: 'ss_01_b_2', kind: 'empty',  name: '',      power: 'off', ports: [],                  media: [] },
              { id: 'ss_01_b_3', kind: 'empty',  name: '',      power: 'off', ports: [],                  media: [] },
              { id: 'ss_01_b_4', kind: 'empty',  name: '',      power: 'off', ports: [],                  media: [] },
              { id: 'ss_01_b_5', kind: 'empty',  name: '',      power: 'off', ports: [],                  media: [] },
            ],
          },
        ],
      },
      {
        id: 'sg_02', tag: 'SG-02', alias: 'Server Room B',
        racks: [
          {
            id: 'sr_02_a', label: 'SG-02-A', alias: '',
            media: [],
            slots: [
              { id: 'ss_02_a_0', kind: 'switch', name: 'sw-app', power: 'on',  ports: ports('rj45', 'green'), media: [] },
              { id: 'ss_02_a_1', kind: 'server', name: 'srv-10', power: 'on',  ports: [],                  media: [] },
              { id: 'ss_02_a_2', kind: 'empty',  name: '',       power: 'off', ports: [],                  media: [] },
              { id: 'ss_02_a_3', kind: 'empty',  name: '',       power: 'off', ports: [],                  media: [] },
              { id: 'ss_02_a_4', kind: 'empty',  name: '',       power: 'off', ports: [],                  media: [] },
              { id: 'ss_02_a_5', kind: 'empty',  name: '',       power: 'off', ports: [],                  media: [] },
            ],
          },
        ],
      },
    ],
  };
}

// ── localStorage ───────────────────────────────────────────
function loadSample() {
  try {
    const s = localStorage.getItem(SAMPLE_KEY);
    if (!s) return null;
    return JSON.parse(s);
  } catch { return null; }
}

function saveSample(cfg) {
  try { localStorage.setItem(SAMPLE_KEY, JSON.stringify(cfg)); } catch {}
}

function loadApiKey() {
  try { return localStorage.getItem(SAMPLE_APIKEY_LS) || ''; } catch { return ''; }
}

function saveApiKey(k) {
  try { localStorage.setItem(SAMPLE_APIKEY_LS, k); } catch {}
}

// ── Immutable config helpers ───────────────────────────────
function addMedia(cfg, groupId, rackId, slotId, mediaItem) {
  return {
    ...cfg,
    groups: cfg.groups.map(g => g.id !== groupId ? g : {
      ...g,
      racks: g.racks.map(r => r.id !== rackId ? r : slotId ? {
        ...r,
        slots: r.slots.map(s => s.id !== slotId ? s : {
          ...s, media: [...(s.media || []), mediaItem],
        }),
      } : {
        ...r, media: [...(r.media || []), mediaItem],
      }),
    }),
  };
}

function removeMedia(cfg, groupId, rackId, slotId, mediaId) {
  return {
    ...cfg,
    groups: cfg.groups.map(g => g.id !== groupId ? g : {
      ...g,
      racks: g.racks.map(r => r.id !== rackId ? r : slotId ? {
        ...r,
        slots: r.slots.map(s => s.id !== slotId ? s : {
          ...s, media: (s.media || []).filter(m => m.id !== mediaId),
        }),
      } : {
        ...r, media: (r.media || []).filter(m => m.id !== mediaId),
      }),
    }),
  };
}

// ── Server sync (async) ────────────────────────────────────
async function serverLoadSample() {
  try {
    const res = await fetch('/api/sample/config');
    if (!res.ok) return null;
    const json = await res.json();
    return json.cfg || null;
  } catch { return null; }
}

async function serverSaveSample(cfg, apiKey) {
  if (!apiKey) return { ok: false, error: 'no-key' };
  try {
    const res = await fetch('/api/sample/config', {
      method: 'PUT',
      headers: { 'Content-Type': 'application/json', 'X-API-Key': apiKey },
      body: JSON.stringify({ cfg }),
    });
    if (!res.ok) return { ok: false, error: await res.text() };
    return { ok: true };
  } catch (e) { return { ok: false, error: String(e) }; }
}

async function serverUploadMedia(file, apiKey) {
  if (!apiKey) throw new Error('API Key를 먼저 입력하세요.');
  const ext = file.name.includes('.') ? file.name.split('.').pop().toLowerCase() : 'bin';
  const key = `sample-${sRid('m')}.${ext}`;
  const res = await fetch(`/api/media/${key}`, {
    method: 'POST',
    headers: { 'Content-Type': file.type || 'application/octet-stream', 'X-API-Key': apiKey },
    body: file,
  });
  if (!res.ok) throw new Error(await res.text());
  return { key, src: `/media/${key}` };
}

async function serverDeleteMedia(src, apiKey) {
  if (!apiKey || !src || !src.startsWith('/media/')) return;
  const key = src.slice('/media/'.length);
  try {
    await fetch(`/api/media/${key}`, { method: 'DELETE', headers: { 'X-API-Key': apiKey } });
  } catch {}
}

Object.assign(window, {
  SAMPLE_KEY, SAMPLE_APIKEY_LS,
  sRid, defaultSampleConfig,
  loadSample, saveSample, loadApiKey, saveApiKey,
  addMedia, removeMedia,
  serverLoadSample, serverSaveSample, serverUploadMedia, serverDeleteMedia,
});
