/**
 * @fileoverview Utilitários para persistência de código no `localStorage`.
 *
 * Utiliza `createStorageService` para centralizar o padrão load/save/debounce.
 * Strings vazias são tratadas como "sem conteúdo" e removem a chave em vez
 * de salvar um valor vazio.
 *
 * Convenções:
 * - Valores válidos são strings não vazias; strings em branco removem a chave.
 * - As chaves são fornecidas pelo chamador, por exemplo: `playground:code`.
 *
 * Exemplo de uso:
 * ```js
 * import { loadCode, createDebouncedCodeSave, clearCodeStorage } from '../services/codestorage';
 *
 * const key = 'playground:code';
 * const code = loadCode(key); // string | null
 * const debouncedSave = createDebouncedCodeSave(1000);
 * debouncedSave(key, code);
 * // Para limpar:
 * clearCodeStorage(key);
 * ```
 *
 * @module services.codestorage
 */

import { createStorageService } from "./createStorageService";

const codeService = createStorageService({
  validator: (v) => typeof v === "string",
  isEmpty: (v) => v.trim() === "",
});

/**
 * Carrega o conteúdo de código associado a `key` no `localStorage`.
 *
 * @param {string} key - Chave usada no `localStorage`
 * @returns {string|null} O conteúdo salvo ou `null` se ausente/inválido
 */
export function loadCode(key) {
  return codeService.load(key);
}

/**
 * Cria uma função de salvamento com debounce para evitar múltiplas escritas
 * consecutivas durante edições rápidas.
 *
 * A função retornada tem a assinatura `(key: string, codeContent: string) => void`.
 *
 * @param {number} [delay=1000] - Tempo de debounce em milissegundos
 * @returns {Function} Função debounced que salva o código fornecido
 *
 * @example
 * const debouncedSave = createDebouncedCodeSave(500);
 * debouncedSave('playground:code', 'console.log("oi")');
 */
export function createDebouncedCodeSave(delay = 1000) {
  return codeService.createDebouncedSave(delay);
}

/**
 * Remove a entrada de código associada à `key` do `localStorage`.
 *
 * @param {string} key - Chave a ser removida
 * @returns {void}
 */
export function clearCodeStorage(key) {
  codeService.clear(key);
}
