import { Response } from 'express';
import { supabase } from '../lib/supabase';
import { AuthenticatedRequest } from '../middleware/auth';
import { callAiModelRaw } from './document.controller';

const DRAFT_SYSTEM_PROMPT = `
      Sen uzman bir Türk avukatısın. Sana verilen dosya bilgilerine göre, istenen türde
      bir dilekçe TASLAĞI yazacaksın. Türk hukuk uygulamasına uygun, resmî bir dille yaz
      (hitap, hususlar, netice-i talep gibi standart dilekçe yapısını kullan).

      EĞER sana bir "BÜRO ŞABLONU" verilmişse: bu şablon, bu hukuk bürosunun kendi imzası
      olan format/dil/üslup tercihidir — YALNIZCA bunun yapısını, dilini, başlıklandırmasını
      ve üslubunu takip et. Şablondaki taraf isimleri, esas no'su, tarihler, mahkeme adı gibi
      ESKİ dosyaya ait somut bilgileri ASLA kullanma veya kopyalama — onların yerine SADECE
      aşağıda verilen YENİ dosyanın gerçek bilgilerini koy.

      ÖNEMLİ — BİÇİMLENDİRME: Bu çıktı doğrudan bir dilekçe belgesine dönüştürülecek, o yüzden
      KESİNLİKLE Markdown biçimlendirmesi kullanma (**, ##, -, *, 1. gibi işaretler YASAK).
      Sadece düz metin yaz. Başlık/vurgu gerekiyorsa BÜYÜK HARF veya standart dilekçe
      başlıkları (örn. "AÇIKLAMALAR:", "HUKUKİ SEBEPLER:", "SONUÇ VE İSTEM:") kullan,
      yıldız veya diyez işareti asla kullanma.

      Sadece dilekçe taslağının kendisini döndür — başlık, açıklama veya ek yorum ekleme.
    `;

// Dilekçe Hazırlama ekranındaki "AI ile Taslak Oluştur" — dosyanın gerçek bilgilerini
// (başlık, UYAP'tan gelen taraflar, varsa Dosya Özeti) ve kullanıcının notlarını,
// isteğe bağlı olarak seçilen büro şablonunun DİLİNİ/FORMATINI referans alarak
// gerçek bir AI taslağı üretir.
export const generateDraft = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { case_id, petition_type, notes, template_id } = req.body || {};
    const userId = req.user?.id;

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

    const { data: caseRow, error: caseError } = await supabase
      .from('cases')
      .select('id, title, parties, user_id')
      .eq('id', case_id)
      .single();
    if (caseError || !caseRow) {
      return res.status(404).json({ error: 'Dava dosyası bulunamadı.' });
    }
    if (caseRow.user_id !== userId) {
      return res.status(403).json({ error: 'Bu dosyaya erişim yetkiniz yok.' });
    }

    const { data: lastAnalysis } = await supabase
      .from('analyses')
      .select('summary_json')
      .eq('case_id', case_id)
      .order('created_at', { ascending: false })
      .limit(1)
      .maybeSingle();

    let template: { name: string; extracted_text: string | null } | null = null;
    if (template_id) {
      const { data: templateRow } = await supabase
        .from('templates')
        .select('name, extracted_text, user_id')
        .eq('id', template_id)
        .single();
      if (templateRow && templateRow.user_id === userId) {
        template = templateRow;
      }
    }

    const partiesText = Array.isArray(caseRow.parties) && caseRow.parties.length > 0
      ? caseRow.parties.map((p: any) => `${p.adi || ''} (${p.rol || ''}${p.vekil ? `, Vekil: ${p.vekil}` : ''})`).join('; ')
      : 'Belirtilmemiş — UYAP Taraf Bilgileri sekmesi henüz çekilmemiş olabilir.';

    const ozet = lastAnalysis?.summary_json?.ozet;

    let userContent = `YENİ DOSYA BİLGİLERİ:\nDosya: ${caseRow.title}\nTaraflar: ${partiesText}\nDilekçe Türü: ${petition_type}\n`;
    if (notes && String(notes).trim()) {
      userContent += `Vurgulanmasını istediğiniz noktalar: ${String(notes).trim()}\n`;
    }
    if (ozet && typeof ozet === 'string') {
      userContent += `\nDosya Özeti (bağlam için):\n${ozet.slice(0, 4000)}\n`;
    }
    if (template?.extracted_text) {
      userContent += `\n---\nBÜRO ŞABLONU "${template.name}" (SADECE dil/format/üslup referansı — içeriğini kopyalama):\n${template.extracted_text.slice(0, 6000)}\n`;
    }

    const { aiContent, aiModel } = await callAiModelRaw(DRAFT_SYSTEM_PROMPT, userContent);

    // Taslağı kalıcı olarak kaydediyoruz — hem "Dilekçelerim" listesinde hem ilgili
    // dava dosyasının kendi "Dilekçeler" bölümünde görünsün, sayfadan çıkınca kaybolmasın.
    const { data: draftRecord, error: draftError } = await supabase
      .from('drafts')
      .insert([{
        user_id: userId,
        case_id,
        petition_type,
        content: aiContent,
        template_id: template_id || null,
      }])
      .select('id, created_at')
      .single();
    if (draftError) {
      console.error('Save Draft Error:', draftError);
    }

    res.json({ draft: aiContent, draftId: draftRecord?.id || null, model: aiModel, usedTemplate: !!template });
  } catch (error: any) {
    console.error('Generate Draft Error:', error);
    res.status(500).json({ error: error.message || 'Internal Server Error' });
  }
};
