/**
 * @fileoverview Persistência do workspace Blockly no `localStorage`.
 *
 * Utiliza `createStorageService` para centralizar o padrão load/save/debounce.
 * O workspace é considerado válido apenas quando possui `blocks.blocks` como
 * array não nulo; estados inválidos (workspace limpo) removem a chave.
 *
 * @module services.blockstorage
 */

import { createStorageService } from "./createStorageService";

/**
 * Valida a estrutura do workspace Blockly serializado.
 * Emite avisos no console para facilitar diagnóstico em desenvolvimento.
 *
 * @param {unknown} workspaceJson - Valor lido do localStorage
 * @returns {boolean}
 */
function isWorkspaceStateValid(workspaceJson) {
  if (!workspaceJson) {
    console.warn("Validação falhou: JSON do workspace é nulo.");
    return false;
  }
  if (typeof workspaceJson.blocks === "undefined") {
    console.warn("Validação falhou: a propriedade 'blocks' não existe.");
    return false;
  }
  if (!Array.isArray(workspaceJson.blocks.blocks)) {
    console.warn("Validação falhou: 'blocks.blocks' não é um array.");
    return false;
  }
  return true;
}

const workspaceService = createStorageService({ validator: isWorkspaceStateValid });

/**
 * Carrega o workspace serializado associado a `key`.
 *
 * @param {string} key - Chave do localStorage
 * @returns {Object|null} Workspace Blockly ou `null` se ausente/inválido
 */
export function loadWorkspace(key) {
  return workspaceService.load(key);
}

/**
 * Cria uma função de salvamento com debounce para evitar múltiplas escritas
 * consecutivas durante edições rápidas.
 *
 * @param {number} [delay=1000] - Tempo de debounce em milissegundos
 * @returns {Function} Função debounced `(key, workspaceJson) => void`
 */
export function createDebouncedSave(delay = 1000) {
  return workspaceService.createDebouncedSave(delay);
}
