import { Injectable, Optional } from '@nestjs/common';
import { IAppConfigData } from './app-config.interface';
import { MODEL_SELECTOR_TEXT } from './app-config.constants';
import { AiModelsService } from './ai-models/ai-models.service';
import { IFullUser, IUserFromToken } from '../users/users.interface';
import { UsersService } from '../users/services/users.service';
import { ConfigService } from './config/config.service';

@Injectable()
export class AppConfigService {
	
	constructor(
		private readonly userService: UsersService,
		@Optional() private readonly aiModelsService?: AiModelsService,
		private readonly configService?: ConfigService,
	) {}
	
	async getAppConfig(user: IUserFromToken): Promise<IAppConfigData> {
		const aiModels = await this.aiModelsService.getAiModels();
		console.log(`AppConfigService: getAppConfig - successfully retrieved ${aiModels.length} AI model groups`);

		const userData = await this.userService.findFullUserById(user._id);
		
		const freeModelsConfig = await this.configService?.getConfigByKey('free_models') || '0';
		console.log(`AppConfigService: getAppConfig - free_models config: ${freeModelsConfig}`);

		const debugWhitelist = (process.env.DEBUG_USERS_EMAILS || '').toLowerCase()
			.split(',').map(s => s.trim()).filter(Boolean);
		const isDebugUser = !!(userData?.email && debugWhitelist.includes(userData.email.toLowerCase()));

		const docsWhitelist = (process.env.DOCS_USERS_EMAILS || '').toLowerCase()
			.split(',').map(s => s.trim()).filter(Boolean);
		const isDocsUser = !!(userData?.email && docsWhitelist.includes(userData.email.toLowerCase()));

		const transcriptionWhitelist = (process.env.TRANSCRIPTION_USERS_EMAILS || '').toLowerCase()
			.split(',').map(s => s.trim()).filter(Boolean);
		const isTranscriptionUser = !!(userData?.email && transcriptionWhitelist.includes(userData.email.toLowerCase()));

		const config: IAppConfigData & { isDebugUser?: boolean; isDocsUser?: boolean; isTranscriptionUser?: boolean } = {
			aiModels,
			text: MODEL_SELECTOR_TEXT,
			user: userData ? { ...((userData as any).toObject ? (userData as any).toObject() : userData), isDebugUser, isDocsUser, isTranscriptionUser } as any : null,
			config: {
				freeModels: freeModelsConfig === '1'
			}
		};

		return config;
	}
	
}


