import { Request, Response } from 'express';
import { supabase } from '../lib/supabase';
import { callOllama } from '../lib/aiClient';
import { buildCaseChatContext } from './chat.controller';

// n8n'in Evolution API'den aldığı gelen mesajı ilettiği uç nokta — bir Supabase
// oturumu taşımıyor (WhatsApp'tan gelen anonim bir mesaj), bu yüzden requireAuth
// yerine paylaşılan bir sır kontrolü kullanılıyor (bkz. routes/whatsapp.routes.ts).

// Telefon numaralarını karşılaştırmadan önce normalize et — n8n'den gelen format
// admin panelinde elle girilenle birebir aynı olmayabilir (boşluk, tire, parantez vb.).
// Ülke kodu hariç sadece rakamları bırakıp başa '+' ekliyoruz.
function normalizePhone(raw: string): string {
  const digits = String(raw || '').replace(/[^\d]/g, '');
  return digits ? `+${digits}` : '';
}

interface CaseRow {
  id: string;
  title: string;
}

async function findCasePicker(phone: string, userId: string): Promise<string> {
  const { data: cases } = await supabase
    .from('cases')
    .select('id, title')
    .eq('user_id', userId)
    .eq('status', 'active')
    .order('updated_at', { ascending: false });

  const activeCases = (cases || []) as CaseRow[];

  if (activeCases.length === 0) {
    return 'Aktif bir dava dosyanız görünmüyor. Bir dosya eklendiğinde buradan sorabilirsiniz.';
  }

  if (activeCases.length === 1) {
    await supabase.from('whatsapp_sessions').upsert({
      phone,
      user_id: userId,
      active_case_id: activeCases[0].id,
      awaiting_case_selection: false,
      updated_at: new Date().toISOString(),
    });
    return '';
  }

  const list = activeCases.map((c, i) => `${i + 1}. ${c.title}`).join('\n');
  await supabase.from('whatsapp_sessions').upsert({
    phone,
    user_id: userId,
    active_case_id: null,
    awaiting_case_selection: true,
    updated_at: new Date().toISOString(),
  });
  return `Hangi dosyayla ilgili konuşmak istersiniz? Numarasını yazın:\n\n${list}`;
}

export const handleWhatsappMessage = async (req: Request, res: Response) => {
  const secret = req.headers['x-webhook-secret'];
  if (!process.env.WHATSAPP_WEBHOOK_SECRET || secret !== process.env.WHATSAPP_WEBHOOK_SECRET) {
    return res.status(401).json({ error: 'Unauthorized' });
  }

  const phoneRaw = String(req.body?.phone || '');
  const text = String(req.body?.text || '').trim();
  const phone = normalizePhone(phoneRaw);

  if (!phone || !text) {
    return res.status(400).json({ error: 'phone ve text zorunludur' });
  }

  try {
    const { data: profile } = await supabase
      .from('profiles')
      .select('id')
      .eq('phone', phone)
      .maybeSingle();

    if (!profile) {
      return res.json({ reply: 'Bu numara AyrisLegal hesabınıza bağlı değil, lütfen bizimle iletişime geçin.' });
    }

    if (text.toLowerCase() === 'dosya değiştir') {
      const reply = await findCasePicker(phone, profile.id);
      return res.json({ reply: reply || 'Dosyanız otomatik seçildi, sorabilirsiniz.' });
    }

    const { data: session } = await supabase
      .from('whatsapp_sessions')
      .select('active_case_id, awaiting_case_selection')
      .eq('phone', phone)
      .maybeSingle();

    let activeCaseId = session?.active_case_id || null;

    if (session?.awaiting_case_selection) {
      const choice = parseInt(text, 10);
      const { data: cases } = await supabase
        .from('cases')
        .select('id, title')
        .eq('user_id', profile.id)
        .eq('status', 'active')
        .order('updated_at', { ascending: false });
      const activeCases = (cases || []) as CaseRow[];
      const picked = !isNaN(choice) ? activeCases[choice - 1] : null;
      if (!picked) {
        const list = activeCases.map((c, i) => `${i + 1}. ${c.title}`).join('\n');
        return res.json({ reply: `Geçerli bir numara yazın:\n\n${list}` });
      }
      activeCaseId = picked.id;
      await supabase.from('whatsapp_sessions').upsert({
        phone,
        user_id: profile.id,
        active_case_id: activeCaseId,
        awaiting_case_selection: false,
        updated_at: new Date().toISOString(),
      });
      return res.json({ reply: `"${picked.title}" seçildi. Şimdi bu dosya hakkında sorabilirsiniz.` });
    }

    if (!activeCaseId) {
      const reply = await findCasePicker(phone, profile.id);
      if (reply) return res.json({ reply });
      const { data: refreshed } = await supabase
        .from('whatsapp_sessions')
        .select('active_case_id')
        .eq('phone', phone)
        .maybeSingle();
      activeCaseId = refreshed?.active_case_id || null;
      if (!activeCaseId) {
        return res.json({ reply: 'Dosya seçilemedi, lütfen tekrar deneyin.' });
      }
    }

    const { error: userMsgError } = await supabase
      .from('chat_messages')
      .insert([{ case_id: activeCaseId, user_id: profile.id, role: 'user', content: text, chat_mode: 'whatsapp' }]);
    if (userMsgError) throw userMsgError;

    const messages = await buildCaseChatContext(activeCaseId, {
      chat_mode: 'whatsapp',
      fallbackUserContent: text,
    });

    const aiContent = await callOllama(messages, { numPredict: 1024, timeoutMs: 60_000 });

    await supabase
      .from('chat_messages')
      .insert([{ case_id: activeCaseId, user_id: profile.id, role: 'assistant', content: aiContent, chat_mode: 'whatsapp' }]);

    return res.json({ reply: aiContent });
  } catch (error: any) {
    console.error('WhatsApp Message Error:', error);
    return res.status(500).json({ error: error.message || 'Internal Server Error' });
  }
};
