💡 Your existing video library (${syncResult.total} videos) is automatically imported.
You can add tags and ratings to organize your content.
📚 Manage your full library from the main menu Library tab for more detailed controls.
`;
}
/**
* Save checkpoint preferences and start level
* @param {number} levelNum - Level to start
*/
saveCheckpointAndStart(levelNum) {
console.log('💾 Saving checkpoint preferences...');
// Collect all preference changes
const updates = {};
// Get all checkboxes
document.querySelectorAll('input[type="checkbox"][data-category]').forEach(checkbox => {
const category = checkbox.dataset.category;
const key = checkbox.dataset.key;
if (!updates[category]) updates[category] = {};
updates[category][key] = checkbox.checked;
});
// Get all sliders
document.querySelectorAll('input[type="range"][data-category]').forEach(slider => {
const category = slider.dataset.category;
const key = slider.dataset.key;
if (!updates[category]) updates[category] = {};
updates[category][key] = parseInt(slider.value);
});
// Get all selects
document.querySelectorAll('select[data-category]').forEach(select => {
const category = select.dataset.category;
const key = select.dataset.key;
if (!updates[category]) updates[category] = {};
updates[category][key] = select.value;
});
// Save to preferenceManager
let saved = true;
if (Object.keys(updates).length > 0) {
saved = window.preferenceManager.updateMultipleCategories(updates, levelNum);
if (saved) {
console.log('✅ Preferences updated:', updates);
} else {
console.error('❌ Failed to save preferences');
alert('⚠️ Unable to save preferences. Storage may be full.\n\nPlease restart the app and try again.');
return;
}
}
// Close modal and begin level
this.closeCheckpointModal();
this.beginLevel(levelNum);
}
/**
* Close checkpoint modal
*/
closeCheckpointModal() {
if (this.currentModal) {
this.currentModal.remove();
this.currentModal = null;
}
}
/**
* Begin level (after checkpoint or directly)
* @param {number} levelNum - Level to start
*/
beginLevel(levelNum) {
console.log(`🚀 Beginning Level ${levelNum}...`);
// Use campaignManager to start level
const levelConfig = window.campaignManager.startLevel(levelNum);
if (!levelConfig) {
alert('Unable to start this level. Please check requirements.');
return;
}
// Hide level select screen
const setupContainer = document.getElementById('academy-setup');
if (setupContainer) {
setupContainer.style.display = 'none';
}
// Start the actual training session
// This would integrate with existing training-academy.html session logic
this.startTrainingSession(levelConfig);
}
/**
* Start training session with level config
* @param {Object} levelConfig - Level configuration
*/
startTrainingSession(levelConfig) {
console.log('🎓 Starting training session with config:', levelConfig);
// Get detailed level configuration from academyLevelData
const detailedConfig = window.academyLevelData.getLevelConfig(levelConfig.levelNumber);
if (!detailedConfig) {
console.error('⚠️ No level data found for level:', levelConfig.levelNumber);
return;
}
console.log('📊 Detailed level config:', detailedConfig);
// Get content filter based on user preferences
const preferenceFilter = window.preferenceManager.getContentFilter();
// Sync with existing library to ensure we have latest videos
window.libraryManager.syncWithExistingLibrary();
// Get media requirements for this level
const mediaRequirements = window.academyLevelData.getMediaForLevel(
levelConfig.levelNumber,
window.preferenceManager.getPreferences()
);
console.log('🎬 Media requirements:', mediaRequirements);
// Get filtered media from library
let mediaItems = window.libraryManager.getMediaForPreferences(
mediaRequirements.videoFilter,
mediaRequirements.videoCount
);
// Fallback to all videos if no matches
if (mediaItems.length === 0) {
console.warn('⚠️ No media items matched preferences. Using all available videos.');
mediaItems = window.libraryManager.getAllVideosWithMetadata();
}
console.log('🎬 Loaded media for session:', mediaItems.length, 'items');
console.log('🎯 Preference filter:', preferenceFilter);
console.log('⏱️ Session duration:', detailedConfig.session.duration);
console.log('📋 Tasks:', detailedConfig.tasks.length);
console.log('🎯 Objectives:', detailedConfig.objectives);
// Sync videos to videoPlayerManager for video playback
if (window.videoPlayerManager && mediaItems.length > 0) {
const videoPaths = mediaItems.map(item => item.path || item.fullPath);
window.videoPlayerManager.videoLibrary.background = videoPaths;
window.videoPlayerManager.videoLibrary.task = videoPaths;
window.videoPlayerManager.videoLibrary.reward = videoPaths;
window.videoPlayerManager.videoLibrary.punishment = videoPaths;
console.log(`🔄 Synced ${videoPaths.length} videos to videoPlayerManager for Level ${levelConfig.levelNumber}`);
}
// Update trainingVideoLibrary global for training-academy.html
if (mediaItems.length > 0) {
window.trainingVideoLibrary = mediaItems;
console.log(`📹 Set trainingVideoLibrary with ${mediaItems.length} videos`);
}
// Enable video if this level requires it (has video media requirements)
if (detailedConfig.media && detailedConfig.media.videos && detailedConfig.media.videos.required > 0) {
// Load and update settings to enable video
const settings = typeof window.loadAcademySettings === 'function'
? window.loadAcademySettings()
: { enableVideo: false };
if (!settings.enableVideo) {
console.log('🎬 Level requires video - enabling video in settings');
settings.enableVideo = true;
if (typeof window.saveAcademySettings === 'function') {
window.saveAcademySettings(settings);
}
}
}
// Set the selected training mode to trigger proper training flow
window.selectedTrainingMode = 'training-academy';
// Store current level info globally for access during session
window.currentAcademyLevel = {
levelNumber: levelConfig.levelNumber,
config: detailedConfig,
mediaRequirements: mediaRequirements
};
// Call the existing training session starter
if (typeof window.startTrainingSession === 'function') {
window.startTrainingSession();
} else {
console.error('⚠️ startTrainingSession() not found in window scope');
}
}
}
// Create global instance
window.academyUI = new AcademyUI();