import { Model } from 'mongoose';
import { ConfigDocument } from '../config.model';
import { Migration } from '../registry/migration.interface';
import { Language } from 'src/shared/language/language.interface';

export const migration_v3: Migration = {
	version: 3,
	name: 'Migrate LocalizedText from old format (en/he) to new format (EN/HB)',
	up: async (configModel: Model<ConfigDocument>) => {
		console.log('Migration 3: up - starting LocalizedText format migration');
		
		const connection = configModel.db;
		const aiModelGroupCollection = connection.collection('aimodelgroups');
		
		// Find all documents
		const groups = await aiModelGroupCollection.find({}).toArray();
		console.log(`Migration 3: up - found ${groups.length} AI model groups to process`);
		
		let totalModelsUpdated = 0;
		
		for (const group of groups) {
			if (!group.models || !Array.isArray(group.models)) {
				continue;
			}
			
			let groupUpdated = false;
			let modelsInGroupUpdated = 0;
			const updatedModels = group.models.map((model: any) => {
				if (!model.description || typeof model.description !== 'object') {
					return model;
				}
				
				const description = model.description;
				const hasOldFormat = description.en !== undefined || description.he !== undefined;
				const hasNewFormat = description[Language.EN] !== undefined || description[Language.HB] !== undefined;
				
				// Skip if already in new format or if no description exists
				if (!hasOldFormat || hasNewFormat) {
					return model;
				}
				
				groupUpdated = true;
				modelsInGroupUpdated++;
				const newDescription: any = {};
				
				// Convert en -> EN
				if (description.en !== undefined) {
					newDescription[Language.EN] = description.en;
				}
				
				// Convert he -> HB
				if (description.he !== undefined) {
					newDescription[Language.HB] = description.he;
				}
				
				// Preserve any other properties that might exist
				Object.keys(description).forEach(key => {
					if (key !== 'en' && key !== 'he' && key !== Language.EN && key !== Language.HB) {
						newDescription[key] = description[key];
					}
				});
				
				return {
					...model,
					description: newDescription
				};
			});
			
			if (groupUpdated) {
				await aiModelGroupCollection.updateOne(
					{ _id: group._id },
					{ $set: { models: updatedModels } }
				);
				totalModelsUpdated += modelsInGroupUpdated;
				console.log(`Migration 3: up - updated ${modelsInGroupUpdated} model(s) in group: ${group.name || group.id}`);
			}
		}
		
		console.log(`Migration 3: up - LocalizedText format migration completed. Updated ${totalModelsUpdated} models across ${groups.length} groups`);
	}
};

