import { Injectable, Logger } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { IFullUser, IMemoryItem, IUser } from 'src/modules/users/users.interface';
import { ChatCompletionCreateParamsBase } from 'openai/resources/chat/completions';
import { FilterSetting } from './filter-setting.model';
import envConfig from 'src/common/config/envConfig';
import { Language } from 'src/shared/language/language.interface';

@Injectable()
export class PromptService {

  private readonly logger = new Logger(PromptService.name);

  constructor(
    @InjectModel(FilterSetting.name) private readonly filterSettingModel: Model<FilterSetting>,
  ) { }

  private getMemoryPrompt(memory: IMemoryItem[]): string {
    if (memory && memory.length > 0) {
      const lastMemories = memory; // .slice(-10)
      return `
		General information about the user: ${lastMemories.map((m) => m.content).join(', ')}.
		`;
    }
    return '';
  }

  async getPrompt(role: IUser['role'], language: Language = Language.EN): Promise<string> {
    const promptDoc = await this.filterSettingModel.findOne({ type: "text" }).lean();

    this.logger.debug(`Generating prompt for role: ${role} and language: ${language}`);

    if (role === 'user') {
      return language === Language.HB ? promptDoc?.systemPromptForUserHe : promptDoc?.systemPromptForUserEn;
    }

    return language === Language.HB ? promptDoc?.systemPromptForAdminHe : promptDoc?.systemPromptForAdminEn;
  }

  async getCommenPersonalizedPromptHeader(user: IFullUser): Promise<string> {
    let res = `
    \n
    User info:
    name: ${user.name}
    Todays date is: ${new Date().toISOString().split('T')[0]}
    `

    if (user?.name) {
      res = res + `
      the user your talking to is: ${user.name}.

      `
    }

    res += this.getMemoryPrompt(user.memory);

    return res; 
  }

  async getPersonalizedPromptHeader(user: IFullUser, providedSystemPrompt?:string): Promise<ChatCompletionCreateParamsBase['messages']> {

    const userLanguage = user.language
    const systemPrompt = providedSystemPrompt || await this.getPrompt(user.role, userLanguage);

    let personalizedPrompt = String(systemPrompt || envConfig().CHAT_GPT_MAIN_PROMPT_INSTRUCTION)
    personalizedPrompt += await this.getCommenPersonalizedPromptHeader(user)
    console.log('personalizedPrompt', personalizedPrompt)

    return [{
      role: 'system',
      content: personalizedPrompt,
    }];
  };

  async getPersonalizedPromptForClaude(user: IFullUser, language: Language) {
    const systemPrompt = await this.getPrompt(user.role, language);

    const isHebrew = language === Language.HB
    let personalizedPrompt = String(systemPrompt || (isHebrew ? envConfig().CLAUDE_HEBREW_MAIN_PROMPT_INSTRUCTION : envConfig().CHAT_GPT_MAIN_PROMPT_INSTRUCTION)) 
    personalizedPrompt += await this.getCommenPersonalizedPromptHeader(user);

    return `${personalizedPrompt}`
  }


  async getPersonalizedPromptHeaderForGemini(user: IFullUser) {
    const userLanguage = (user.language || Language.EN) as Language
    const systemPrompt = await this.getPrompt(user.role, userLanguage);
    let personalizedPrompt = String(systemPrompt || envConfig().GEMINI_MAIN_PROMPT_INSTRUCTION) 
    personalizedPrompt += await this.getCommenPersonalizedPromptHeader(user);

    return personalizedPrompt;
  };

}
