import React, { useState } from 'react';
import { FaRobot, FaSpinner } from 'react-icons/fa';
import { createReviewViaAPI, getReviewsByMediaId } from '../../services/pocketbaseService';

const AIReviewModal = ({ media, onClose, onSuccess }) => {
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);
  const [review, setReview] = useState(null);

  const generateAIReview = async () => {
    setLoading(true);
    setError(null);

    try {
      // Проверяем, является ли characteristics уже объектом
      let characteristics;
      try {
        characteristics = typeof media.characteristics === 'string' 
          ? JSON.parse(media.characteristics)
          : media.characteristics;
      } catch (e) {
        console.error('Ошибка при парсинге characteristics:', e);
        characteristics = media.characteristics;
      }

      // Получаем существующие рецензии для обучения ИИ
      const existingReviews = await getReviewsByMediaId(media.id);
      const reviewsContent = existingReviews.map(r => r.content).join('\n\n');

      const prompt = `Ты - эксперт по оценке ${media.type === 'movie' ? 'фильмов' : media.type === 'tv' ? 'сериалов' : media.type === 'anime' ? 'аниме' : 'игр'} на сайте Campfire Critics.
      Твоя задача - написать рецензию на "${media.title}", основываясь на мнении пользователей сайта.
      
      Вот существующие рецензии пользователей на это произведение:
      ${reviewsContent}
      
      Напиши рецензию, которая отражает общее мнение пользователей сайта, но при этом сохраняет профессиональный тон.
      Оцени следующие характеристики по шкале от 1 до 10: ${Object.keys(characteristics).join(', ')}.
      
      Ответ должен быть в формате JSON:
      {
        "content": "текст рецензии",
        "ratings": {
          "характеристика1": число,
          "характеристика2": число,
          ...
        }
      }`;

      const response = await fetch('/api/generate-review', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          prompt,
          model: 'google/gemma-3-27b-it:free',
          temperature: 0.7,
          max_tokens: 1000
        })
      });

      if (!response.ok) {
        const errorData = await response.json();
        throw new Error(errorData.error?.message || 'Ошибка при генерации рецензии');
      }

      const data = await response.json();
      
      // Извлекаем JSON из markdown-формата
      let aiResponseText = data.choices[0].message.content;
      
      // Ищем JSON в тексте (может быть обернут в ```json или просто быть чистым JSON)
      const jsonMatch = aiResponseText.match(/```(?:json)?\s*(\{[\s\S]*?\})\s*```/) || 
                       aiResponseText.match(/(\{[\s\S]*\})/);
      
      if (!jsonMatch) {
        throw new Error('Не удалось найти JSON в ответе ИИ');
      }
      
      try {
        const aiResponse = JSON.parse(jsonMatch[1] || jsonMatch[0]);

        if (!aiResponse || typeof aiResponse !== 'object') {
          console.error('Неверный формат ответа:', aiResponse);
          throw new Error('Неверный формат ответа от ИИ');
        }

        if (!aiResponse.content || !aiResponse.ratings) {
          console.error('Отсутствуют обязательные поля:', aiResponse);
          throw new Error('Отсутствуют обязательные поля в ответе ИИ');
        }

        // Проверяем, что все оценки являются числами
        const ratings = aiResponse.ratings;
        for (const [key, value] of Object.entries(ratings)) {
          if (typeof value !== 'number' || isNaN(value)) {
            ratings[key] = Number(value);
            if (isNaN(ratings[key])) {
              throw new Error(`Некорректное значение оценки для характеристики "${key}"`);
            }
          }
        }

        // Рассчитываем общую оценку
        const overallRating = Object.values(ratings).reduce((sum, value) => sum + value, 0) / Object.keys(ratings).length;

        // Создаем рецензию
        const reviewData = {
          media_id: media.id,
          user_id: 'g520s25pzm0t6e1',
          content: aiResponse.content,
          ratings: aiResponse.ratings,
          has_spoilers: false,
          media_type: media.type,
          overall_rating: parseFloat(overallRating.toFixed(2)),
          progress: media.type === 'game' ? 'completed' : 'watched'
        };

        const createdReview = await createReviewViaAPI(reviewData);
        setReview(createdReview);
        onSuccess(createdReview);
      } catch (parseError) {
        console.error('Ошибка парсинга JSON:', parseError);
        console.error('Проблемный текст:', aiResponseText);
        throw new Error('Неверный формат JSON в ответе ИИ');
      }
    } catch (err) {
      console.error('Ошибка при генерации рецензии:', err);
      setError(err.message || 'Произошла ошибка при генерации рецензии');
    } finally {
      setLoading(false);
    }
  };

  return (
    <div className="p-6 bg-campfire-charcoal rounded-lg shadow-md text-campfire-light">
      <h2 className="text-2xl font-bold mb-6">ИИ-рецензия для {media.title}</h2>

      {error && (
        <div className="bg-status-error/20 text-status-error p-4 rounded-md mb-6">
          {error}
        </div>
      )}

      {!review ? (
        <div className="text-center">
          <p className="mb-6 text-campfire-ash">
            Нажмите кнопку ниже, чтобы сгенерировать рецензию с помощью ИИ
          </p>
          <button
            onClick={generateAIReview}
            disabled={loading}
            className="btn-primary flex items-center gap-2 mx-auto"
          >
            {loading ? <FaSpinner className="animate-spin" /> : <FaRobot />}
            <span>{loading ? 'Генерация...' : 'Сгенерировать рецензию'}</span>
          </button>
        </div>
      ) : (
        <div className="space-y-4">
          <div className="bg-campfire-dark p-4 rounded-lg">
            <h3 className="font-semibold mb-2">Рецензия:</h3>
            <p className="text-campfire-ash">{review.content}</p>
          </div>
          <div className="bg-campfire-dark p-4 rounded-lg">
            <h3 className="font-semibold mb-2">Оценки:</h3>
            <div className="grid grid-cols-2 gap-4">
              {Object.entries(review.ratings).map(([key, value]) => (
                <div key={key} className="flex justify-between">
                  <span className="text-campfire-ash">{key}:</span>
                  <span className="text-campfire-light">{value}/10</span>
                </div>
              ))}
            </div>
          </div>
          <div className="flex justify-end mt-6">
            <button onClick={onClose} className="btn-secondary">
              Закрыть
            </button>
          </div>
        </div>
      )}
    </div>
  );
};

export default AIReviewModal; 