// 공개 서버 설정 store.
//
// /api/config/public 을 초기 1회 fetch 해서 upload.max_bytes 등 프론트 UX 에
// 필요한 값을 공급. 서버가 authoritative 소스이며, 여기서는 캐시만 제공.
//
// fetch 실패 시 하드코딩 fallback 값을 유지해 초기 렌더 깜빡임과 offline UX
// 퇴행을 방지. 실제 size enforcement 는 서버 (/documents/ POST 413) 가 담당
// 하므로 fallback 값이 일시적으로 서버와 불일치해도 보안적 영향 없음.
//
// API 응답 shape: app/api/config.py PublicConfigResponse 참조

import { writable } from 'svelte/store';
import { api } from '$lib/api';

export interface PublicConfig {
  upload: {
    max_bytes: number;
  };
}

// 서버 fetch 전 fallback. 실제 정책값은 서버 config.yaml `upload.max_bytes`.
const FALLBACK_CONFIG: PublicConfig = {
  upload: {
    max_bytes: 100_000_000,
  },
};

let fetched = false;
let inFlight: Promise<void> | null = null;

const internal = writable<PublicConfig>(FALLBACK_CONFIG, (_set) => {
  // 첫 구독 시 1회만 fetch
  if (!fetched) {
    void refresh();
  }
});

export const publicConfig = { subscribe: internal.subscribe };

export async function refresh(): Promise<void> {
  if (inFlight) return inFlight;
  inFlight = (async () => {
    try {
      const data = await api<PublicConfig>('/config/public');
      internal.set(data);
      fetched = true;
    } catch (err) {
      // fallback 유지. 서버 enforcement 가 본선이므로 UI fallback 은 안전.
      console.error('공개 설정 fetch 실패, fallback 사용:', err);
    } finally {
      inFlight = null;
    }
  })();
  return inFlight;
}
