'use strict';
(function () {
let catalog = { sets: [], stats: {} };
const esc = value => String(value ?? '').replace(/[&<>"']/g, char => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[char]);
const tr = (key, fallback) => window.t?.(key, fallback) || fallback;
if (!document.querySelector('link[data-package-library-style]')) {
const link = document.createElement('link');
Object.assign(link, { rel: 'stylesheet', href: 'styles/package-library.css' });
link.dataset.packageLibraryStyle = 'true';
document.head.appendChild(link);
}
const componentHtml = component => `
${esc(component.type)}${esc(component.componentId)} ${tr(`packageLibrary.${component.required ? 'required' : 'optional'}`, component.required ? 'required' : 'optional')}
v${esc(component.version || '?')} ${esc(component.region || '')}${esc(component.sha256)}
`;
const recipeHtml = item => `${esc(item.label || item.recipeKey)}v${esc(item.version)} ${esc(item.state)} ${esc(item.recipeSha256.slice(0, 12))}...`;
function setHtml(set) {
const recipes = set.recipes.length ? set.recipes.map(recipeHtml).join('') : `${esc(tr('packageLibrary.noRecipes', 'No recipes yet'))}`;
return `${esc(set.title.externalTitleId)}
${esc(set.title.name)}
${esc(set.label || set.setKey)}${esc(set.platform)} ${esc(set.region || '')} ${esc(set.confidence)} ${esc(set.source)}
${esc(tr('packageLibrary.components', 'Components'))} (${set.components.length})
${set.components.map(componentHtml).join('')}
${esc(tr('packageLibrary.recipes', 'Recipes'))} (${set.recipes.length})
`;
}
function render() {
const host = document.getElementById('package-library-content');
if (!host) return;
const query = document.getElementById('package-library-search')?.value.trim().toLowerCase();
const sets = catalog.sets.filter(set => !query || JSON.stringify(set).toLowerCase().includes(query));
host.innerHTML = sets.length ? `${sets.map(setHtml).join('')}
` : `${esc(tr('packageLibrary.empty', 'No package sets match'))}${esc(tr('packageLibrary.emptyDetail', 'Import or adjust the search. Package inventory never implies installation.'))}
`;
const stats = document.getElementById('package-library-stats');
if (stats) stats.textContent = [['titles', 'titles'], ['sets', 'sets'], ['components', 'componentsLower'], ['recipes', 'recipesLower']].map(([field, key]) => `${catalog.stats[field] || 0} ${tr(`packageLibrary.${key}`, field)}`).join(' / ');
}
window.loadPackages = async () => { catalog = await window.pork.packageCatalog(); render(); };
document.getElementById('package-library-search')?.addEventListener('input', render);
})();