import { showNotification } from "../notification.js";
import { refreshHud } from "../hud.js";
/* ── Einstiegspunkt ─────────────────────────────── */
export async function loadMine(buildingId) {
const actionsTab = document.getElementById("tab-actions");
if (!actionsTab) return;
actionsTab.innerHTML = `
Lade Mineninfo...
`;
await renderMineStatus(buildingId);
}
/* ─────────────────────────────────────────────────
Haupt-Render-Funktion
───────────────────────────────────────────────── */
async function renderMineStatus(buildingId) {
const actionsTab = document.getElementById("tab-actions");
try {
const res = await fetch("/api/mine/" + buildingId + "/status");
if (!res.ok) throw new Error("API Fehler");
const data = await res.json();
if (data.error) {
actionsTab.innerHTML = "" + data.error + "
";
return;
}
actionsTab.innerHTML =
"" +
renderHeader(data) +
renderDivider() +
renderResourceSelector(data, buildingId) +
(data.selected_resource ? renderProductionSection(data) : "") +
(data.selected_resource ? renderDivider() : "") +
(data.selected_resource ? renderLoopSection(data, buildingId) : "") +
(data.selected_resource ? renderDivider() : "") +
(data.selected_resource ? renderCollectSection(data, buildingId) : "") +
"
";
if (data.selected_resource) {
startCountdown(buildingId, data);
}
} catch (err) {
console.error("Mine Fehler:", err);
actionsTab.innerHTML =
"Fehler beim Laden der Mineninfo.
";
}
}
/* ─────────────────────────────────────────────────
Abschnitt: Header (Level + Zyklusinfo)
───────────────────────────────────────────────── */
function renderHeader(data) {
let cycleText = "Keine Ressource gewählt";
if (data.selected_resource) {
if (data.is_full) {
cycleText = "Voll – bitte abholen!";
} else if (data.cycles > 0) {
cycleText = data.cycles + "x Zyklus abgeschlossen";
} else {
cycleText = "Läuft...";
}
}
return (
""
);
}
/* ─────────────────────────────────────────────────
Abschnitt: Ressourcen-Auswahl
───────────────────────────────────────────────── */
function renderResourceSelector(data, buildingId) {
const resources = data.production; // [{resource, amount}]
const buttons = resources.map(r => {
const isSelected = data.selected_resource === r.resource;
return (
""
);
}).join("");
return (
"Ressource wählen
" +
"" +
buttons +
"
"
);
}
/* ─────────────────────────────────────────────────
Abschnitt: Aktuelle Produktion
───────────────────────────────────────────────── */
function renderProductionSection(data) {
const minutesLeft = Math.floor(data.next_cycle_in_seconds / 60);
const secondsLeft = data.next_cycle_in_seconds % 60;
const maxHoursDisplay = data.max_hours + "h";
const progressPercent = Math.min(
100,
Math.round((data.cycles / data.max_cycles) * 100)
);
return (
renderDivider() +
"Aktuelle Produktion
" +
"" +
"" + resourceIcon(data.selected_resource) + "" +
"" + resourceLabel(data.selected_resource) + "" +
"" + data.available_amount + "" +
"
" +
"" +
"" +
"" +
(data.is_full
? "Maximale Zeit erreicht (" + maxHoursDisplay + ")"
: "Nächster Zyklus in") +
"" +
(data.is_full
? "VOLL"
: "" +
minutesLeft + "m " + secondsLeft + "s") +
"
"
);
}
/* ─────────────────────────────────────────────────
Abschnitt: Schleifen (Loops)
───────────────────────────────────────────────── */
function renderLoopSection(data, buildingId) {
const loopDots = [];
for (let i = 0; i < 4; i++) {
loopDots.push(
""
);
}
const canBuy = data.loops_available > 0 && data.can_afford_loop;
const maxReached = data.loops_available === 0;
return (
"Schleifen
" +
"" +
"
" + loopDots.join("") + "
" +
"
" +
data.max_hours + "h max" +
(maxReached ? " (Max)" : "") +
"" +
"
" +
(!maxReached
? ""
: ""
)
);
}
/* ─────────────────────────────────────────────────
Abschnitt: Abholen-Button
───────────────────────────────────────────────── */
function renderCollectSection(data, buildingId) {
return (
"" +
"" +
"
"
);
}
function renderDivider() {
return "";
}
/* ─────────────────────────────────────────────────
Event-Delegation: Ressource wählen
───────────────────────────────────────────────── */
document.addEventListener("click", async (e) => {
const btn = e.target.closest(".mine-res-btn");
if (!btn || btn.classList.contains("mine-res-btn-active")) return;
const resource = btn.dataset.resource;
const buildingId = btn.dataset.building;
// Alle Buttons kurz deaktivieren
document.querySelectorAll(".mine-res-btn").forEach(b => b.disabled = true);
try {
const res = await fetch("/api/mine/" + buildingId + "/select", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ resource }),
});
if (!res.ok) throw new Error("API Fehler");
const data = await res.json();
if (data.error) {
showNotification(data.error, "Mine", "⛏️");
await renderMineStatus(buildingId);
return;
}
showNotification(
resourceLabel(resource) + " ausgewählt.\nTimer wurde zurückgesetzt.",
"Mine", "⛏️"
);
await renderMineStatus(buildingId);
} catch (err) {
console.error("Ressource wählen Fehler:", err);
await renderMineStatus(buildingId);
}
});
/* ─────────────────────────────────────────────────
Event-Delegation: Schleife kaufen
───────────────────────────────────────────────── */
document.addEventListener("click", async (e) => {
const btn = e.target.closest("#mine-loop-btn");
if (!btn || btn.disabled) return;
const buildingId = btn.dataset.building;
btn.disabled = true;
btn.textContent = "Kaufe...";
try {
const res = await fetch("/api/mine/" + buildingId + "/loop", {
method: "POST",
});
if (!res.ok) throw new Error("API Fehler");
const data = await res.json();
if (data.error) {
showNotification(data.error, "Mine", "⛏️");
await renderMineStatus(buildingId);
return;
}
showNotification(
"Schleife aktiviert! +" + 5 + "h Abbauzeit.\n" +
"Noch " + data.loops_available + " Schleife(n) verfügbar.",
"Mine", "💎"
);
await renderMineStatus(buildingId);
await refreshHud();
} catch (err) {
console.error("Schleife kaufen Fehler:", err);
await renderMineStatus(buildingId);
}
});
/* ─────────────────────────────────────────────────
Event-Delegation: Ressource abholen
───────────────────────────────────────────────── */
document.addEventListener("click", async (e) => {
const btn = e.target.closest("#mine-collect-btn");
if (!btn || btn.disabled) return;
const buildingId = btn.dataset.building;
btn.disabled = true;
btn.textContent = "Wird abgeholt...";
try {
const res = await fetch("/api/mine/" + buildingId + "/collect", {
method: "POST",
});
if (!res.ok) throw new Error("API Fehler");
const data = await res.json();
if (data.error) {
showNotification(
data.ready_in_display
? "Noch nicht bereit.\nBereit in: " + data.ready_in_display
: data.error,
"Mine", "⛏️"
);
await renderMineStatus(buildingId);
return;
}
const c = data.collected;
showNotification(
"Abgeholt!\n" + resourceLabel(c.resource) + ": +" + c.amount,
"Mine", "⛏️"
);
await renderMineStatus(buildingId);
await refreshHud();
} catch (err) {
console.error("Abholen Fehler:", err);
showNotification("Fehler beim Abholen. Bitte erneut versuchen.", "Fehler", "⚠️");
await renderMineStatus(buildingId);
}
});
/* ─────────────────────────────────────────────────
Countdown-Timer
───────────────────────────────────────────────── */
let countdownInterval = null;
function startCountdown(buildingId, data) {
if (countdownInterval) clearInterval(countdownInterval);
if (data.is_full) return;
countdownInterval = setInterval(() => {
const el = document.getElementById("mine-countdown");
if (!el) { clearInterval(countdownInterval); return; }
let secs = parseInt(el.dataset.seconds, 10) - 1;
if (secs < 0) secs = 0;
el.dataset.seconds = secs;
el.textContent = Math.floor(secs / 60) + "m " + (secs % 60) + "s";
if (secs === 0) {
clearInterval(countdownInterval);
renderMineStatus(buildingId);
}
}, 1000);
}
/* ─────────────────────────────────────────────────
Icons & Labels
───────────────────────────────────────────────── */
function resourceIcon(resource) {
const imgMap = {
iron: "/images/items/eisen.png",
gold: "/images/items/goldmuenze.png",
wood: "/images/items/holz.png",
stone: "/images/items/stein.png",
};
if (imgMap[resource]) {
return (
"" +
"
" +
""
);
}
return "📦";
}
function resourceLabel(resource) {
const map = {
gold: "Gold",
iron: "Eisen",
stone: "Stein",
wood: "Holz",
};
return map[resource] || resource;
}