// URL для LibreTranslate API (сохраняем, но не используем)
const TRANSLATE_API_URL = 'https://translate.maxdev.keenetic.pro/translate';

// URL и ключ для OpenRouter API
const OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions';
const OPENROUTER_API_KEY = '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';

// Модели для перевода
const TRANSLATION_MODELS = {
  PRIMARY: 'meta-llama/llama-3.3-70b-instruct:free', // Основная модель
  FALLBACK: 'openchat/openchat-7b:free', // Резервная модель
};

// Интерфейс для ответа от LibreTranslate API
interface TranslateResponse {
  translatedText: string;
  detectedLanguage: {
    confidence: number;
    language: string;
  };
  alternatives: string[];
}

// Интерфейс для ответа от OpenRouter API
interface OpenRouterResponse {
  choices: {
    message: {
      content: string;
      role: string;
    };
    index: number;
    finish_reason: string;
  }[];
  id: string;
  model: string;
  object: string;
  usage: {
    prompt_tokens: number;
    completion_tokens: number;
    total_tokens: number;
  };
}

/**
 * Проверяет, содержит ли текст признаки отказа от модели
 * @param text Текст для проверки
 * @returns true, если текст похож на отказ модели, иначе false
 */
function isModelRefusal(text: string): boolean {
  if (!text) return false;
  
  // Проверка на специальный маркер отказа
  if (text.trim() === 'TRANSLATION_FAILED') {
    console.log('Обнаружен специальный маркер отказа: TRANSLATION_FAILED');
    return true;
  }
  
  const lowerText = text.toLowerCase();
  
  // Типичные фразы отказа от моделей
  const refusalPhrases = [
    // Специальные маркеры
    "translation_failed",
    "translation failed",
    "cannot translate",
    
    // Стандартные фразы отказа
    "i'm sorry",
    "i apologize",
    "i cannot",
    "i'm not able to",
    "i am unable to",
    "i can't",
    "cannot assist",
    "unable to provide",
    "against my ethical guidelines",
    "violates content policy",
    "not going to translate",
    "contains derogatory",
    "racial slurs",
    "offensive content",
    "inappropriate language",
    "inappropriate content",
    "harmful content",
    "offensive language",
    "offensive terms",
    "violates",
    "policy",
    "guidelines"
  ];
  
  for (const phrase of refusalPhrases) {
    if (lowerText.includes(phrase)) {
      console.log(`Обнаружена фраза отказа модели: ${phrase}`);
      return true;
    }
  }
  
  // Проверка на наличие кавычек и ключевых слов
  const keywordsWithQuotes = [
    { keyword: "translate", quoteRequired: true },
    { keyword: "translation", quoteRequired: true },
    { keyword: "content", quoteRequired: false },
    { keyword: "inappropriate", quoteRequired: false },
    { keyword: "offensive", quoteRequired: false }
  ];
  
  for (const item of keywordsWithQuotes) {
    const hasKeyword = lowerText.includes(item.keyword);
    const hasQuotes = lowerText.includes('"') || lowerText.includes("'");
    
    if (hasKeyword && (!item.quoteRequired || hasQuotes)) {
      console.log(`Обнаружено ключевое слово "${item.keyword}" ${item.quoteRequired ? "с кавычками" : "без требования кавычек"}`);
      return true;
    }
  }
  
  return false;
}

const translateService = {
  // Старый метод перевода через LibreTranslate (сохраняем, но не используем)
  async translateToEnglish(text: string, maxRetries = 3): Promise<{ success: boolean; text: string }> {
    let retries = 0;

    while (retries <= maxRetries) {
      try {
        // Добавляем задержку перед повторными попытками
        if (retries > 0) {
          await new Promise(resolve => setTimeout(resolve, 1000)); // 1 секунда между попытками
        }

        const response = await fetch(TRANSLATE_API_URL, {
          method: 'POST',
          body: JSON.stringify({
            q: text,
            source: 'auto',
            target: 'en',
            format: 'text',
            alternatives: 3,
            api_key: ''
          }),
          headers: { 'Content-Type': 'application/json' }
        });

        if (!response.ok) {
          throw new Error(`Translation failed with status: ${response.status}`);
        }

        const data: TranslateResponse = await response.json();
        
        // Успешный перевод
        return { success: true, text: data.translatedText };
      } catch (error) {
        console.error(`Translation attempt ${retries + 1} failed:`, error);
        retries++;
      }
    }

    // Все попытки исчерпаны, возвращаем исходный текст с флагом неудачи
    console.error(`All ${maxRetries} translation attempts failed`);
    return { success: false, text: text };
  },

  // Новый метод перевода через OpenRouter API
  async translateWithLLM(text: string): Promise<{ success: boolean; text: string }> {
    // Массив моделей для последовательных попыток
    const models = [
      TRANSLATION_MODELS.PRIMARY,
      TRANSLATION_MODELS.FALLBACK
    ];
    
    // Проверка, что текст не пустой
    if (!text || text.trim() === '') {
      console.error('Пустой текст для перевода');
      return { success: false, text };
    }
    
    // Проверка, что текст не на английском языке
    const isAlreadyEnglish = /^[a-zA-Z0-9\s.,!?;:()\-"']+$/.test(text.trim());
    if (isAlreadyEnglish) {
      console.log('Текст уже на английском языке, перевод не требуется');
      return { success: true, text };
    }
    
    // Логирование запроса
    console.log(`Запрос на перевод текста: "${text.substring(0, 50)}${text.length > 50 ? '...' : ''}"`);
    
    // Последовательно пробуем каждую модель
    for (let i = 0; i < models.length; i++) {
      const model = models[i];
      console.log(`Попытка перевода через модель ${model} (${i + 1}/${models.length})`);
      
      try {
        const response = await fetch(OPENROUTER_API_URL, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
            'Authorization': `Bearer ${OPENROUTER_API_KEY}`,
            'HTTP-Referer': window.location.origin,
            'X-Title': 'Sticker Generator App'
          },
          body: JSON.stringify({
            model: model,
            messages: [
              {
                role: 'system',
                content: 'You are a professional translator. Your task is to translate the following text from any language to English. ONLY return the translated text without ANY additional comments, explanations, or quotation marks. Do not include phrases like "Translation:" or "Translated text:". If you cannot translate the text for any reason (such as it containing offensive, inappropriate, or harmful content), respond with "TRANSLATION_FAILED" and nothing else.'
              },
              {
                role: 'user',
                content: text
              }
            ],
            temperature: 0.2, // Снижаем температуру для более предсказуемых ответов
            max_tokens: 200
          })
        });

        if (!response.ok) {
          const errorData = await response.json().catch(() => ({}));
          console.error(`Ошибка API для модели ${model}:`, errorData);
          throw new Error(`OpenRouter API failed with status: ${response.status}`);
        }

        const data: OpenRouterResponse = await response.json();
        const translatedText = data.choices[0].message.content.trim();
        
        // Логирование ответа
        console.log(`Ответ от модели ${model}: "${translatedText.substring(0, 100)}${translatedText.length > 100 ? '...' : ''}"`);
        
        // Проверка, что получили непустой ответ
        if (!translatedText) {
          throw new Error('Empty translation result');
        }
        
        // Проверка на отказ модели
        if (isModelRefusal(translatedText)) {
          console.warn(`Модель ${model} отказалась переводить текст. Полный ответ: "${translatedText}"`);
          
          // Если это основная модель, сразу возвращаем ошибку
          // и не пытаемся использовать резервную модель
          if (model === TRANSLATION_MODELS.PRIMARY) {
            return { success: false, text: 'Недопустимый промпт' };
          } else {
            throw new Error('Model refused to translate');
          }
        }
        
        // Проверка, что перевод отличается от исходного текста
        if (translatedText.toLowerCase().trim() === text.toLowerCase().trim()) {
          console.warn(`Модель ${model} вернула исходный текст без перевода`);
          throw new Error('Translation returned original text');
        }
        
        // Проверка на подозрительные паттерны в переводе
        const punctuationRatio = (translatedText.match(/[.,!?;:()[\]{}'"]/g) || []).length / translatedText.length;
        if (punctuationRatio > 0.3) { // Если более 30% текста - знаки препинания
          console.warn(`Подозрительно высокое содержание знаков препинания в переводе: ${(punctuationRatio * 100).toFixed(1)}%`);
          throw new Error('Suspicious translation result');
        }
        
        console.log(`Успешный перевод через модель ${model}:`, translatedText);
        return { success: true, text: translatedText };
      } catch (error) {
        console.error(`Ошибка перевода через модель ${model}:`, error);
        
        // Если это была последняя модель, прекращаем попытки
        if (i === models.length - 1) {
          console.error('Все попытки перевода через LLM не удались');
          return { success: false, text: 'Недопустимый промпт' };
        }
        // Иначе продолжаем со следующей моделью (только при технических ошибках)
      }
    }

    // Этот код не должен выполниться, но оставляем для полноты
    console.error('Все попытки перевода через LLM не удались');
    return { success: false, text: 'Недопустимый промпт' };
  }
};

export default translateService;
