import { Injectable, Logger } from '@nestjs/common';

/**
 * Multi-Language Support Service
 *
 * Handles AI responses in multiple languages with culturally appropriate content
 */

export type SupportedLanguage = 'en' | 'es' | 'fr' | 'pt' | 'zh';

export interface LanguageConfig {
  code: SupportedLanguage;
  name: string;
  nativeName: string;
  systemPromptSuffix: string;
}

@Injectable()
export class MultiLanguageService {
  private readonly logger = new Logger(MultiLanguageService.name);

  private readonly languageConfigs: Map<SupportedLanguage, LanguageConfig> =
    new Map([
      [
        'en',
        {
          code: 'en',
          name: 'English',
          nativeName: 'English',
          systemPromptSuffix: 'Respond in English (US).',
        },
      ],
      [
        'es',
        {
          code: 'es',
          name: 'Spanish',
          nativeName: 'Español',
          systemPromptSuffix:
            'Responde en español. Usa lenguaje claro y apropiado para padres de familia.',
        },
      ],
      [
        'fr',
        {
          code: 'fr',
          name: 'French',
          nativeName: 'Français',
          systemPromptSuffix:
            'Répondez en français. Utilisez un langage clair et approprié pour les parents.',
        },
      ],
      [
        'pt',
        {
          code: 'pt',
          name: 'Portuguese',
          nativeName: 'Português',
          systemPromptSuffix:
            'Responda em português (brasileiro). Use linguagem clara e apropriada para pais.',
        },
      ],
      [
        'zh',
        {
          code: 'zh',
          name: 'Chinese (Simplified)',
          nativeName: '简体中文',
          systemPromptSuffix: '请用简体中文回答。使用清晰且适合父母的语言。',
        },
      ],
    ]);

  /**
   * Get language configuration
   */
  getLanguageConfig(language: SupportedLanguage): LanguageConfig {
    return (
      this.languageConfigs.get(language) || this.languageConfigs.get('en')!
    );
  }

  /**
   * Build localized system prompt
   */
  buildLocalizedSystemPrompt(
    basePrompt: string,
    language: SupportedLanguage,
  ): string {
    const config = this.getLanguageConfig(language);

    return `${basePrompt}

LANGUAGE INSTRUCTIONS:
${config.systemPromptSuffix}

IMPORTANT: All responses must be in ${config.name} (${config.nativeName}). Maintain cultural sensitivity and use appropriate terminology for parenting in the target language's cultural context.`;
  }

  /**
   * Get localized medical disclaimers
   */
  getMedicalDisclaimer(
    language: SupportedLanguage,
    severity: 'emergency' | 'high' | 'medium',
  ): string {
    const disclaimers = {
      en: {
        emergency: `⚠️ **EMERGENCY - SEEK IMMEDIATE MEDICAL ATTENTION**

This appears to be a medical emergency. Please:

1. **Call 911 immediately** (or your local emergency number)
2. If your child is not breathing, begin CPR if trained
3. Do not delay seeking professional medical help

**I am an AI assistant and cannot provide emergency medical care. Your child needs immediate professional medical attention.**`,
        high: `⚠️ **IMPORTANT MEDICAL NOTICE**

Your question involves symptoms that may require urgent medical attention. While I can provide general information, I am not a doctor and cannot diagnose medical conditions.

**Please contact your pediatrician or seek urgent care if:**
- Symptoms are severe or worsening
- Your child appears very ill or in distress
- You are worried about your child's condition

For immediate concerns, call your doctor's office or visit urgent care. If it's an emergency, call 911.`,
        medium: `📋 **Medical Disclaimer**

I can provide general information and parenting support, but I am not a medical professional. This information is not a substitute for professional medical advice, diagnosis, or treatment.

**Always consult your pediatrician for:**
- Medical advice about your child's health
- Diagnosis of symptoms or conditions
- Treatment recommendations or medication questions

If you're concerned about your child's health, please contact your healthcare provider.`,
      },
      es: {
        emergency: `⚠️ **EMERGENCIA - BUSQUE ATENCIÓN MÉDICA INMEDIATA**

Esto parece ser una emergencia médica. Por favor:

1. **Llame al 911 inmediatamente** (o su número de emergencia local)
2. Si su hijo no respira, comience RCP si está capacitado
3. No demore en buscar ayuda médica profesional

**Soy un asistente de IA y no puedo proporcionar atención médica de emergencia. Su hijo necesita atención médica profesional inmediata.**`,
        high: `⚠️ **AVISO MÉDICO IMPORTANTE**

Su pregunta involucra síntomas que pueden requerir atención médica urgente. Aunque puedo proporcionar información general, no soy médico y no puedo diagnosticar condiciones médicas.

**Por favor contacte a su pediatra o busque atención urgente si:**
- Los síntomas son severos o empeoran
- Su hijo parece muy enfermo o en dificultad
- Está preocupado por la condición de su hijo

Para preocupaciones inmediatas, llame al consultorio de su médico o visite atención urgente. Si es una emergencia, llame al 911.`,
        medium: `📋 **Descargo Médico**

Puedo proporcionar información general y apoyo parental, pero no soy profesional médico. Esta información no sustituye el consejo, diagnóstico o tratamiento médico profesional.

**Siempre consulte a su pediatra para:**
- Consejo médico sobre la salud de su hijo
- Diagnóstico de síntomas o condiciones
- Recomendaciones de tratamiento o preguntas sobre medicamentos

Si le preocupa la salud de su hijo, contacte a su proveedor de atención médica.`,
      },
      fr: {
        emergency: `⚠️ **URGENCE - CHERCHEZ UNE ATTENTION MÉDICALE IMMÉDIATE**

Cela semble être une urgence médicale. Veuillez:

1. **Appelez le 15 ou 112 immédiatement** (ou votre numéro d'urgence local)
2. Si votre enfant ne respire pas, commencez la RCR si vous êtes formé
3. Ne tardez pas à chercher de l'aide médicale professionnelle

**Je suis un assistant IA et ne peux pas fournir de soins médicaux d'urgence. Votre enfant a besoin d'attention médicale professionnelle immédiate.**`,
        high: `⚠️ **AVIS MÉDICAL IMPORTANT**

Votre question concerne des symptômes qui peuvent nécessiter une attention médicale urgente. Bien que je puisse fournir des informations générales, je ne suis pas médecin et ne peux pas diagnostiquer des conditions médicales.

**Veuillez contacter votre pédiatre ou chercher des soins urgents si:**
- Les symptômes sont graves ou s'aggravent
- Votre enfant semble très malade ou en détresse
- Vous êtes inquiet pour l'état de votre enfant

Pour des préoccupations immédiates, appelez le cabinet de votre médecin ou visitez les soins urgents. Si c'est une urgence, appelez le 15 ou 112.`,
        medium: `📋 **Avertissement Médical**

Je peux fournir des informations générales et un soutien parental, mais je ne suis pas un professionnel de la santé. Ces informations ne remplacent pas les conseils, le diagnostic ou le traitement médical professionnel.

**Consultez toujours votre pédiatre pour:**
- Des conseils médicaux sur la santé de votre enfant
- Le diagnostic de symptômes ou de conditions
- Des recommandations de traitement ou des questions sur les médicaments

Si vous êtes préoccupé par la santé de votre enfant, contactez votre professionnel de santé.`,
      },
      pt: {
        emergency: `⚠️ **EMERGÊNCIA - PROCURE ATENDIMENTO MÉDICO IMEDIATO**

Isto parece ser uma emergência médica. Por favor:

1. **Ligue 192 ou 193 imediatamente** (ou seu número de emergência local)
2. Se seu filho não está respirando, inicie RCP se treinado
3. Não demore em procurar ajuda médica profissional

**Sou um assistente de IA e não posso fornecer cuidados médicos de emergência. Seu filho precisa de atenção médica profissional imediata.**`,
        high: `⚠️ **AVISO MÉDICO IMPORTANTE**

Sua pergunta envolve sintomas que podem requerer atenção médica urgente. Embora eu possa fornecer informações gerais, não sou médico e não posso diagnosticar condições médicas.

**Por favor contate seu pediatra ou procure atendimento urgente se:**
- Os sintomas são graves ou piorando
- Seu filho parece muito doente ou em sofrimento
- Você está preocupado com a condição do seu filho

Para preocupações imediatas, ligue para o consultório do seu médico ou visite atendimento urgente. Se for uma emergência, ligue 192 ou 193.`,
        medium: `📋 **Aviso Médico**

Posso fornecer informações gerais e apoio parental, mas não sou profissional de saúde. Estas informações não substituem aconselhamento, diagnóstico ou tratamento médico profissional.

**Sempre consulte seu pediatra para:**
- Aconselhamento médico sobre a saúde do seu filho
- Diagnóstico de sintomas ou condições
- Recomendações de tratamento ou perguntas sobre medicamentos

Se está preocupado com a saúde do seu filho, contate seu provedor de saúde.`,
      },
      zh: {
        emergency: `⚠️ **紧急情况 - 立即寻求医疗救助**

这似乎是医疗紧急情况。请:

1. **立即拨打120** (或您当地的急救电话)
2. 如果您的孩子没有呼吸,如果您受过训练,请开始心肺复苏术
3. 不要延误寻求专业医疗帮助

**我是AI助手,无法提供紧急医疗护理。您的孩子需要立即的专业医疗关注。**`,
        high: `⚠️ **重要医疗提示**

您的问题涉及可能需要紧急医疗关注的症状。虽然我可以提供一般信息,但我不是医生,无法诊断医疗状况。

**如果出现以下情况,请联系您的儿科医生或寻求紧急护理:**
- 症状严重或恶化
- 您的孩子看起来病得很重或处于困境中
- 您担心孩子的状况

对于紧急关注,请致电您医生的诊所或前往急诊。如果是紧急情况,请拨打120。`,
        medium: `📋 **医疗免责声明**

我可以提供一般信息和育儿支持,但我不是医疗专业人员。此信息不能替代专业医疗建议、诊断或治疗。

**请始终咨询您的儿科医生:**
- 关于孩子健康的医疗建议
- 症状或状况的诊断
- 治疗建议或药物问题

如果您担心孩子的健康,请联系您的医疗保健提供者。`,
      },
    };

    return disclaimers[language]?.[severity] || disclaimers['en'][severity];
  }

  /**
   * Get localized mental health resources
   */
  getMentalHealthResources(language: SupportedLanguage): string {
    const resources = {
      en: `💙 **Mental Health Support**

I hear that you're going through a difficult time. Your mental health is important, and you deserve support.

**I am an AI assistant and cannot provide mental health treatment or crisis intervention.**

If you're experiencing a mental health crisis or having thoughts of harming yourself:

**Please reach out to these resources immediately:**

- **National Suicide Prevention Lifeline**: 988 (call or text)
- **Crisis Text Line**: Text HOME to 741741
- **Postpartum Support International**: 1-800-944-4773

You can also:
- Contact your doctor or mental health provider
- Go to your nearest emergency room
- Call 911 if you're in immediate danger

There is help available, and you don't have to go through this alone.`,
      es: `💙 **Apoyo de Salud Mental**

Escucho que estás pasando por un momento difícil. Tu salud mental es importante y mereces apoyo.

**Soy un asistente de IA y no puedo proporcionar tratamiento de salud mental o intervención en crisis.**

Si estás experimentando una crisis de salud mental o tienes pensamientos de hacerte daño:

**Por favor comunícate inmediatamente con estos recursos:**

- **Línea Nacional de Prevención del Suicidio**: 988 (llamada o texto)
- **Línea de Texto de Crisis**: Envía HOME al 741741
- **Apoyo Posparto Internacional**: 1-800-944-4773

También puedes:
- Contactar a tu médico o proveedor de salud mental
- Ir a tu sala de emergencias más cercana
- Llamar al 911 si estás en peligro inmediato

Hay ayuda disponible y no tienes que pasar por esto solo/a.`,
      fr: `💙 **Soutien en Santé Mentale**

J'entends que vous traversez une période difficile. Votre santé mentale est importante et vous méritez du soutien.

**Je suis un assistant IA et ne peux pas fournir de traitement en santé mentale ou d'intervention en cas de crise.**

Si vous vivez une crise de santé mentale ou avez des pensées d'auto-mutilation:

**Veuillez contacter immédiatement ces ressources:**

- **Numéro National de Prévention du Suicide**: 3114
- **SOS Amitié**: 09 72 39 40 50
- **Fil Santé Jeunes**: 0 800 235 236

Vous pouvez également:
- Contacter votre médecin ou professionnel de santé mentale
- Aller aux urgences les plus proches
- Appeler le 15 si vous êtes en danger immédiat

Il y a de l'aide disponible et vous n'avez pas à traverser cela seul(e).`,
      pt: `💙 **Apoio à Saúde Mental**

Ouço que você está passando por um momento difícil. Sua saúde mental é importante e você merece apoio.

**Sou um assistente de IA e não posso fornecer tratamento de saúde mental ou intervenção em crise.**

Se você está experienciando uma crise de saúde mental ou tendo pensamentos de se machucar:

**Por favor entre em contato imediatamente com estes recursos:**

- **CVV - Centro de Valorização da Vida**: 188
- **CAPS - Centro de Atenção Psicossocial**: Procure o mais próximo
- **SAMU**: 192

Você também pode:
- Contatar seu médico ou profissional de saúde mental
- Ir ao pronto-socorro mais próximo
- Ligar 192 se estiver em perigo imediato

Há ajuda disponível e você não precisa passar por isso sozinho(a).`,
      zh: `💙 **心理健康支持**

我听到您正在经历困难时期。您的心理健康很重要,您值得获得支持。

**我是AI助手,无法提供心理健康治疗或危机干预。**

如果您正在经历心理健康危机或有自残想法:

**请立即联系这些资源:**

- **心理援助热线**: 400-161-9995
- **北京心理危机研究与干预中心**: 010-82951332
- **全国心理援助热线**: 各地不同,请查询当地热线

您也可以:
- 联系您的医生或心理健康专业人员
- 前往最近的急诊室
- 如果处于紧急危险中,请拨打120

有可用的帮助,您不必独自经历这一切。`,
    };

    return resources[language] || resources['en'];
  }

  /**
   * Detect language from user message
   */
  detectLanguage(message: string): SupportedLanguage {
    // Simple heuristic-based language detection
    // For production, consider using a proper language detection library

    // Chinese characters
    if (/[\u4e00-\u9fff]/.test(message)) {
      return 'zh';
    }

    // Spanish common words and patterns
    const spanishPatterns =
      /\b(el|la|los|las|un|una|y|o|de|en|por|para|con|hijo|hija|bebé|niño|niña)\b/i;
    if (spanishPatterns.test(message)) {
      return 'es';
    }

    // French common words and patterns
    const frenchPatterns =
      /\b(le|la|les|un|une|et|ou|de|en|pour|avec|enfant|bébé)\b/i;
    if (frenchPatterns.test(message)) {
      return 'fr';
    }

    // Portuguese common words and patterns
    const portuguesePatterns =
      /\b(o|a|os|as|um|uma|e|ou|de|em|por|para|com|filho|filha|bebê|criança)\b/i;
    if (portuguesePatterns.test(message)) {
      return 'pt';
    }

    // Default to English
    return 'en';
  }

  /**
   * Get all supported languages
   */
  getSupportedLanguages(): LanguageConfig[] {
    return Array.from(this.languageConfigs.values());
  }

  /**
   * Validate language code
   */
  isValidLanguage(language: string): language is SupportedLanguage {
    return this.languageConfigs.has(language as SupportedLanguage);
  }
}
