import { DateTime } from 'luxon';
import { fetchJson } from '../../api.js';
import type { LauncherWebMainBgImage, StoredData } from '../../types.js';
import { BASE_URL, gameTargets, launcherWebApiLang } from '../../utils/constants.js';
export async function renderMainBgImage(container: HTMLElement) {
const outerCard = document.createElement('div');
outerCard.className = 'card mb-3';
const header = document.createElement('div');
header.className = 'card-header d-flex justify-content-between align-items-center';
header.style.cursor = 'pointer';
header.setAttribute('data-bs-toggle', 'collapse');
header.setAttribute('data-bs-target', '#collapseMainBgImage');
header.setAttribute('role', 'button');
header.innerHTML = '
Main Background Image
';
outerCard.appendChild(header);
const collapseDiv = document.createElement('div');
collapseDiv.id = 'collapseMainBgImage';
collapseDiv.className = 'collapse';
outerCard.appendChild(collapseDiv);
const outerCardBody = document.createElement('div');
outerCardBody.className = 'card-body';
collapseDiv.appendChild(outerCardBody);
// --- UI Controls ---
const controls = document.createElement('div');
controls.className = 'row g-3 mb-4';
const targetCol = document.createElement('div');
targetCol.className = 'col-md-6';
targetCol.innerHTML = '';
const targetSelect = document.createElement('select');
targetSelect.className = 'form-select';
gameTargets.forEach((target, idx) => {
const option = document.createElement('option');
option.value = idx.toString();
option.textContent = `${target.region === 'cn' ? 'China' : 'Global'} - ${target.name}`;
targetSelect.appendChild(option);
});
targetCol.appendChild(targetSelect);
const langCol = document.createElement('div');
langCol.className = 'col-md-6';
langCol.innerHTML = '';
const langSelect = document.createElement('select');
langSelect.className = 'form-select';
langCol.appendChild(langSelect);
controls.appendChild(targetCol);
controls.appendChild(langCol);
outerCardBody.appendChild(controls);
const contentDiv = document.createElement('div');
outerCardBody.appendChild(contentDiv);
// --- Logic ---
const updateLanguages = () => {
const targetIdx = parseInt(targetSelect.value, 10);
const target = gameTargets[targetIdx]!;
const langs = launcherWebApiLang[target.region] || [];
const defaultLang = target.region === 'os' ? 'en-us' : 'zh-cn';
langSelect.innerHTML = '';
langs.forEach((lang) => {
const option = document.createElement('option');
option.value = lang;
option.textContent = lang;
if (lang === defaultLang) option.selected = true;
langSelect.appendChild(option);
});
langCol.style.display = langs.length <= 1 ? 'none' : 'block';
};
const getMirrorUrl = (url: string) => {
try {
const u = new URL(url);
return `https://raw.githubusercontent.com/daydreamer-json/ak-endfield-api-archive/refs/heads/main/output/raw/${u.hostname}${u.pathname}`;
} catch {
return url;
}
};
const renderContent = async () => {
const targetIdx = parseInt(targetSelect.value, 10);
const target = gameTargets[targetIdx]!;
const lang = langSelect.value;
if (!lang) {
contentDiv.innerHTML = 'No language selected.
';
return;
}
contentDiv.innerHTML = 'Loading background images...
';
const url = `${BASE_URL}/akEndfield/launcher/web/${target.dirName}/main_bg_image/${lang}/all.json`;
try {
const data = await fetchJson[]>(url);
if (!data || data.length === 0) {
contentDiv.innerHTML = 'No data found.
';
return;
}
// Collect unique images by MD5 from the entire history
const imageMap = new Map();
const sortedData = [...data].sort(
(a, b) => DateTime.fromISO(b.updatedAt).toMillis() - DateTime.fromISO(a.updatedAt).toMillis(),
);
for (const entry of sortedData) {
if (!entry.rsp || !entry.rsp.main_bg_image) continue;
const img = entry.rsp.main_bg_image;
if (!imageMap.has(img.md5)) {
imageMap.set(img.md5, { image: img, firstSeen: entry.updatedAt });
}
}
contentDiv.innerHTML = '';
if (imageMap.size === 0) {
contentDiv.innerHTML = 'No images found.
';
return;
}
const row = document.createElement('div');
row.className = 'row row-cols-1 row-cols-md-2 row-cols-lg-3 g-3';
contentDiv.appendChild(row);
for (const [md5, { image, firstSeen }] of imageMap) {
const col = document.createElement('div');
col.className = 'col';
const dateStr = DateTime.fromISO(firstSeen).toFormat('yyyy/MM/dd HH:mm');
const mirrorUrl = getMirrorUrl(image.url);
const linkUrl = image.video_url ? getMirrorUrl(image.video_url) : mirrorUrl;
col.innerHTML = `
${image.video_url ? 'Video' : ''}
`;
row.appendChild(col);
}
} catch (e) {
console.warn(`Failed to load ${url}`, e);
contentDiv.innerHTML = 'Failed to load data.
';
}
};
targetSelect.addEventListener('change', () => {
updateLanguages();
renderContent();
});
langSelect.addEventListener('change', renderContent);
updateLanguages();
renderContent();
container.appendChild(outerCard);
}