import { NextResponse } from 'next/server';
import fs from 'fs';
import path from 'path';

export const runtime = 'nodejs';

// ─── الإعدادات ────────────────────────────────────────────
const API_BASE = (
  process.env.NEXT_PUBLIC_AAU_API_BASE_URL ||
  process.env.AAU_API_BASE_URL ||
  'https://edu.yemenfrappe.com'
).replace(/\/$/, '');

const CONFIG_ENDPOINT = '/api/method/aau_university.api.v1.smartchat.get_public_smartchat_config';
const ASK_ENDPOINT    = '/api/method/aau_university.api.v1.smartchat.ask_smart_chat';

const FETCH_TIMEOUT_MS = 15_000; // 15 ثانية حد أقصى للانتظار
const MAX_QUESTION_LENGTH = 500; // حد أقصى لطول السؤال

// ─── رسائل الخطأ المنوّعة ─────────────────────────────────
const FALLBACK_MESSAGES = [
  'عذراً 😅، صار عندي خلل بسيط بالسيرفر. جرّب مرة ثانية بعد شوية! 🙏',
  'يبدو هناك مشكلة تقنية مؤقتة 😕، بس لا تقلق! جرّب تسألني مجدداً بعد لحظة 🔄',
  'لم أتمكن من معالجة طلبك حالياً 🤔، جرّب مرة ثانية وأنا جاهز نشاط أكثر! ✨',
];

function getRandomFallback(): string {
  return FALLBACK_MESSAGES[Math.floor(Math.random() * FALLBACK_MESSAGES.length)];
}

// ─── فك تغليف الاستجابة ───────────────────────────────────
function unwrapPayload(payload: any) {
  if (payload?.message?.data !== undefined) return payload.message.data;
  if (payload?.message !== undefined)       return payload.message;
  if (payload?.data !== undefined)          return payload.data;
  return payload;
}

// ─── fetch مع Timeout ─────────────────────────────────────
async function fetchWithTimeout(
  url: string,
  options: RequestInit,
  timeoutMs = FETCH_TIMEOUT_MS
): Promise<Response> {
  const controller = new AbortController();
  const timer = setTimeout(() => controller.abort(), timeoutMs);
  try {
    return await fetch(url, { ...options, signal: controller.signal });
  } finally {
    clearTimeout(timer);
  }
}

// ─── قراءة ملف CSV للأسئلة الإنجليزية ───────────────────
let englishQA: { question: string; answer: string; suggestions: string[] }[] = [];

function loadEnglishQA() {
  try {
    const csvPath = path.join(process.cwd(), 'data', 'english_qa.csv');
    const csvContent = fs.readFileSync(csvPath, 'utf-8');
    const lines = csvContent.split('\n').slice(1); // Skip header
    englishQA = lines
      .filter(line => line.trim())
      .map(line => {
        // Simple CSV parser that handles quoted fields
        const fields: string[] = [];
        let current = '';
        let inQuotes = false;
        for (let i = 0; i < line.length; i++) {
          const char = line[i];
          if (char === '"') {
            inQuotes = !inQuotes;
          } else if (char === ',' && !inQuotes) {
            fields.push(current.replace(/^"|"$/g, '').trim());
            current = '';
          } else {
            current += char;
          }
        }
        fields.push(current.replace(/^"|"$/g, '').trim());

        const [question, answer, suggestionsStr] = fields;
        return {
          question: question || '',
          answer: answer || '',
          suggestions: suggestionsStr ? suggestionsStr.split(',').map(s => s.trim()) : []
        };
      });
  } catch (error) {
    console.error('[SmartChat] Failed to load English QA CSV:', error);
    englishQA = [];
  }
}

// تحميل البيانات عند بدء الخادم
loadEnglishQA();

// ─── البحث عن إجابة في CSV ─────────────────────────────
function findEnglishAnswer(question: string): { answer: string; suggestions: string[] } | null {
  const normalizedQuestion = question.toLowerCase().trim();
  for (const qa of englishQA) {
    const normalizedQAQuestion = qa.question.toLowerCase().trim();
    if (normalizedQAQuestion.includes(normalizedQuestion) ||
        normalizedQuestion.includes(normalizedQAQuestion)) {
      return { answer: qa.answer, suggestions: qa.suggestions };
    }
  }
  return null;
}

// ─── التحقق من أن الرد يتعلق بالجامعة ─────────────────
function isUniversityRelated(answer: string, lang: 'ar' | 'en'): boolean {
  // تحديد لغة الرد بناءً على محتواه
  const arabicChars = (answer.match(/[\u0600-\u06FF]/g) || []).length;
  const totalChars = answer.replace(/\s/g, '').length;
  const detectedLang = totalChars > 0 && arabicChars / totalChars >= 0.3 ? 'ar' : 'en';

  const universityKeywords = {
    ar: ['جامعة', 'جامعة الجيل الجديد', 'الجيل الجديد', 'كلية', 'قسم', 'طالب', 'طالبة', 'دراسة', 'تسجيل', 'قبول', 'منحة', 'رسوم', 'مبنى', 'حرم', 'مكتبة', 'مختبر', 'رياضة', 'نشاط', 'فعالية', 'إدارة', 'عميد', 'دكتور', 'أستاذ', 'محاضر', 'منهج', 'مادة', 'امتحان', 'نتيجة', 'شهادة', 'دبلوم', 'بكالوريوس', 'ماجستير', 'دكتوراه'],
    en: ['university', 'al-jeel al-jadeed', 'college', 'department', 'student', 'study', 'registration', 'admission', 'scholarship', 'fees', 'building', 'campus', 'library', 'laboratory', 'sports', 'activity', 'event', 'administration', 'dean', 'doctor', 'professor', 'lecturer', 'curriculum', 'course', 'exam', 'result', 'certificate', 'diploma', 'bachelor', 'master', 'phd', 'doctorate']
  };

  const keywords = universityKeywords[detectedLang];
  const lowerAnswer = answer.toLowerCase();
  return keywords.some(keyword => lowerAnswer.includes(keyword.toLowerCase()));
}

// ─── إضافة تحذير للردود المحتملة غير الدقيقة ──────────
function addHallucinationWarning(answer: string): string {
  // تحديد لغة الرد
  const arabicChars = (answer.match(/[\u0600-\u06FF]/g) || []).length;
  const totalChars = answer.replace(/\s/g, '').length;
  const detectedLang = totalChars > 0 && arabicChars / totalChars >= 0.3 ? 'ar' : 'en';

  return answer;
}
function preprocessQuestion(raw: string): string {
  return raw
    .trim()
    // إزالة المسافات المتعددة
    .replace(/\s+/g, ' ')
    // إزالة الرموز الغريبة مع الحفاظ على العربية والإنجليزية والأرقام
    .replace(/[^\u0600-\u06FFa-zA-Z0-9\s?.،,؟!]/g, '')
    // تطبيع بعض الأحرف العربية الشائعة الخطأ
    .replace(/أ|إ|آ/g, 'ا')
    .replace(/ة/g, 'ة')
    .trim();
}

// ─── التحقق من صحة السؤال ─────────────────────────────────
function validateQuestion(question: string): { valid: boolean; reason?: string } {
  if (!question || question.length === 0) {
    return { valid: false, reason: 'empty' };
  }
  if (question.length < 2) {
    return { valid: false, reason: 'too_short' };
  }
  if (question.length > MAX_QUESTION_LENGTH) {
    return { valid: false, reason: 'too_long' };
  }
  return { valid: true };
}

// ─── ردود التحقق بناءً على اللغة ───────────────────────
function getValidationResponse(reason: string, lang: 'ar' | 'en' = 'ar') {
  const responses: Record<string, { ar: string[]; en: string[] }> = {
    empty: {
      ar: [
        'يبدو رسالتك فارغة! 😂 كيف أقدر أساعدك لو ما كتبتشيء؟ 😊',
        'وصلتني رسالة فارغة! 🤷‍♂️ شاركني بسؤالك وأنا هنا 😊',
      ],
      en: [
        'Looks like your message is empty! 😂 How can I help if you don\'t write anything? 😊',
        'I received an empty message! 🤷 Share your question with me 😊',
      ],
    },
    too_short: {
      ar: [
        'سؤالك قصير شوية! 😅 هل تقدر توضح أكثر عشان أساعدك صح! 🎓',
        'احتاج منك تفاصيل أكثر 🙏، شو اللي تود تسأل عنه؟ حكلي علي 😊',
      ],
      en: [
        'Your question is a bit short! 😅 Can you give me more details so I can help properly? 🎓',
        'I need a bit more context 🙏 — what exactly are you looking for? 😊',
      ],
    },
    too_long: {
      ar: [
        'سؤالك طويل شوية! 😂 هل تقدر تلخصه بجملة أو جملتين؟ حتى أفهم أكثر 🎯',
        'حاول تختصر سؤالك قليلاً 😊، عشان أفهمه عدل وأجاوبك بأحسن شكل!',
      ],
      en: [
        'That\'s quite a long question! 😂 Can you summarize it in a sentence or two? 🎯',
        'Try shortening your question a bit 😊 so I can understand it better and give you a great answer!',
      ],
    },
  };

  const group = responses[reason] || responses['empty'];
  const options = group[lang] || group['ar'];
  return options[Math.floor(Math.random() * options.length)];
}

// ─── GET: جلب الإعدادات ───────────────────────────────────
export async function GET() {
  const defaultConfig = {
    enabled: true,
    chatNameAr: 'مساعدك الذكي ✨',
    chatNameEn: 'Smart Assistant ✨',
    provider: 'Gemini',
  };

  try {
    const response = await fetchWithTimeout(
      `${API_BASE}${CONFIG_ENDPOINT}`,
      { headers: { Accept: 'application/json' }, cache: 'no-store' }
    );

    if (!response.ok) return NextResponse.json(defaultConfig);

    const payload = await response.json();
    return NextResponse.json(unwrapPayload(payload) || defaultConfig);
  } catch (error: any) {
    // تسجيل الخطأ للمطور فقط (لا يظهر للمستخدم)
    console.error('[SmartChat][GET] Config fetch failed:', error?.message || error);
    return NextResponse.json(defaultConfig);
  }
}

// ─── POST: معالجة السؤال ────────────────────────────
export async function POST(req: Request) {
  try {
    const body = await req.json().catch(() => ({}));
    const rawQuestion = typeof body?.question === 'string' ? body.question : '';
    // ── اسخدام اللغة المرسلة من العميل إن وجدت ──
    const clientLang: 'ar' | 'en' = body?.lang === 'en' ? 'en' : 'ar';

    // 1. تنظيف السؤال أولاً
    const cleanedQuestion = preprocessQuestion(rawQuestion);

    // 2. التحقق من صحة السؤال
    const validation = validateQuestion(cleanedQuestion);
    if (!validation.valid) {
      return NextResponse.json({
        answer: getValidationResponse(validation.reason!, clientLang),
        type: 'validation',
        suggestions: [],
      });
    }

    // 3. إذا كان السؤال بالإنجليزية، ابحث في CSV أولاً
    if (clientLang === 'en') {
      const csvResult = findEnglishAnswer(cleanedQuestion);
      if (csvResult) {
        return NextResponse.json({
          answer: csvResult.answer,
          type: 'university',
          suggestions: csvResult.suggestions,
        });
      }
    }

    // 4. إرسال السؤال المنظّف للـ Backend
    const response = await fetchWithTimeout(
      `${API_BASE}${ASK_ENDPOINT}`,
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          Accept: 'application/json',
        },
        cache: 'no-store',
        body: JSON.stringify({ question: cleanedQuestion }),
      }
    );

    // 5. معالجة الاستجابة
    const payload = await response.json().catch(() => ({}));
    const data    = unwrapPayload(payload) || {};

    // تسجيل للمطور عند الفشل
    if (!response.ok) {
      console.error('[SmartChat][POST] Backend error:', response.status, data);
    }

    let finalAnswer = data?.answer || fallbackMsg;
    let finalType = data?.type || 'university';

    // منع الهلوسة: التحقق من أن الرد يتعلق بالجامعة
    if (data?.answer && !isUniversityRelated(data.answer, clientLang)) {
      // إذا لم يكن الرد متعلق بالجامعة، أعطِ رد عام
      finalAnswer = clientLang === 'en'
        ? "I'm sorry, but I can only provide information related to Al-Jeel Al-Jadeed University (AAU). For other topics, please consult appropriate sources. 🤔"
        : "عذراً، لكنني أستطيع تقديم معلومات متعلقة بجامعة الجيل الجديد فقط. لمواضيع أخرى، يرجى استشارة مصادر مناسبة. 🤔";
      finalType = 'outside';
    } else if (data?.answer) {
      // إضافة تحذير للردود من API الخارجي لتجنب الهلوسة
      finalAnswer = addHallucinationWarning(data.answer);
    }

    return NextResponse.json(
      {
        answer: finalAnswer,
        type: finalType,
        suggestions: Array.isArray(data?.suggestions) ? data.suggestions : [],
      },
      { status: response.ok ? 200 : 500 }
    );

  } catch (error: any) {
    // Timeout أو خطأ شبكة
    const isTimeout = error?.name === 'AbortError';
    console.error('[SmartChat][POST] Error:', isTimeout ? 'TIMEOUT' : error?.message);
    // لا نستطيع معرفة لغة المستخدم بعد الفشل — نستخدم العربية افتراضياً
    return NextResponse.json({
      answer: isTimeout
        ? 'استغرق الرد وقتاً طويلاً بشوية! ⏳ جرّب مرة ثانية، غالباً يتحسن الأمر!'
        : getRandomFallback(),
      type: 'error',
      suggestions: [],
    });
  }
}