// Data models class Dish { constructor(name) { this.id = this.generateUUID(); this.name = name; this.createdAt = new Date().toISOString(); } generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } } class History { constructor(dishId) { this.id = this.generateUUID(); this.dishId = dishId; this.selectedAt = new Date().toISOString(); } generateUUID() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { const r = Math.random() * 16 | 0; const v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } } // App state let dishes = []; let history = []; // DOM Elements const welcomeScreen = document.getElementById('welcome-screen'); const dishesScreen = document.getElementById('dishes-screen'); const homeScreen = document.getElementById('home-screen'); const resultScreen = document.getElementById('result-screen'); const addFirstDishBtn = document.getElementById('add-first-dish-btn'); const dishInput = document.getElementById('dish-input'); const addDishBtn = document.getElementById('add-dish-btn'); const dishesList = document.getElementById('dishes-list'); const randomBtn = document.getElementById('random-btn'); const selectedDish = document.getElementById('selected-dish'); const cookBtn = document.getElementById('cook-btn'); const anotherBtn = document.getElementById('another-btn'); const manageDishesBtn = document.getElementById('manage-dishes-btn'); const backToHomeBtn = document.getElementById('back-to-home-btn'); const backToHomeResultBtn = document.getElementById('back-to-home-result-btn'); // Initialize app function init() { loadData(); setupEventListeners(); if (dishes.length === 0) { showScreen('welcome'); } else { showScreen('home'); } } // Event listeners function setupEventListeners() { addFirstDishBtn.addEventListener('click', () => { showScreen('dishes'); dishInput.focus(); }); addDishBtn.addEventListener('click', addDish); dishInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') addDish(); }); randomBtn.addEventListener('click', getRandomDish); cookBtn.addEventListener('click', () => showScreen('home')); anotherBtn.addEventListener('click', getRandomDish); manageDishesBtn.addEventListener('click', () => { showScreen('dishes'); renderDishesList(); }); backToHomeBtn.addEventListener('click', () => { if (dishes.length === 0) { showScreen('welcome'); } else { showScreen('home'); } }); backToHomeResultBtn.addEventListener('click', () => showScreen('home')); } // Screen management function showScreen(screen) { welcomeScreen.classList.add('hidden'); dishesScreen.classList.add('hidden'); homeScreen.classList.add('hidden'); resultScreen.classList.add('hidden'); switch(screen) { case 'welcome': welcomeScreen.classList.remove('hidden'); break; case 'dishes': dishesScreen.classList.remove('hidden'); renderDishesList(); break; case 'home': homeScreen.classList.remove('hidden'); break; case 'result': resultScreen.classList.remove('hidden'); break; } } // Dish management function addDish() { const name = dishInput.value.trim(); if (!name) return; const dish = new Dish(name); dishes.push(dish); saveData(); dishInput.value = ''; renderDishesList(); if (dishes.length === 1) { showScreen('home'); } } function editDish(id) { const dish = dishes.find(d => d.id === id); if (!dish) return; const newName = prompt('Введите новое название:', dish.name); if (newName && newName.trim()) { dish.name = newName.trim(); saveData(); renderDishesList(); } } function deleteDish(id) { if (!confirm('Вы уверены, что хотите удалить это блюдо?')) return; dishes = dishes.filter(d => d.id !== id); history = history.filter(h => h.dishId !== id); saveData(); renderDishesList(); if (dishes.length === 0) { showScreen('welcome'); } } // Random selection with 3-day repeat protection function getRandomDish() { if (dishes.length === 0) { showScreen('welcome'); return; } const threeDaysAgo = new Date(); threeDaysAgo.setDate(threeDaysAgo.getDate() - 3); const recentDishIds = history .filter(h => new Date(h.selectedAt) > threeDaysAgo) .map(h => h.dishId); let availableDishes = dishes.filter(d => !recentDishIds.includes(d.id)); if (availableDishes.length === 0) { availableDishes = dishes; } const randomIndex = Math.floor(Math.random() * availableDishes.length); const selected = availableDishes[randomIndex]; const historyEntry = new History(selected.id); history.push(historyEntry); saveData(); selectedDish.textContent = selected.name; showScreen('result'); } // Render functions function renderDishesList() { dishesList.innerHTML = ''; if (dishes.length === 0) { dishesList.innerHTML = '
Пока нет блюд. Добавьте первое!
'; return; } dishes.forEach(dish => { const dishElement = document.createElement('div'); dishElement.className = 'dish-item'; dishElement.innerHTML = ` ${dish.name}