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

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.

      EĞER sana "REFERANS MADDELER" verilmişse: bunları gerektiğinde "HUKUKİ SEBEPLER"
      bölümünde doğal bir atıfla (örn. "TCK'nın 141. maddesi uyarınca...") kullan —
      metinlerini olduğu gibi kopyalama, sadece atıf için referans al.

      Ö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.
    `;

function formatReferenceBlock(matches: LegislationMatch[]): string {
  if (matches.length === 0) return '';
  const body = matches
    .map((m) => `${m.kanun} madde ${m.maddeNo}${m.baslik ? ` - ${m.baslik}` : ''}: ${m.metin}`)
    .join('\n\n');
  return `\n---\nREFERANS MADDELER (SADECE ATIF İÇİNDİR, DOĞRUDAN KOPYALAMA):\n${body}\n---\n`;
}

function toTraceableLegislation(matches: LegislationMatch[]) {
  return matches.map(({ maddeNo, baslik, kanun }) => ({ maddeNo, baslik, kanun }));
}

// 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 legislationLookupText = `${caseRow.title}\n${partiesText}\n${notes || ''}\n${typeof ozet === 'string' ? ozet : ''}`;
    const legislationMatches = await findRelevantLegislation(legislationLookupText);
    userContent += formatReferenceBlock(legislationMatches);

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

    // 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,
        used_legislation: toTraceableLegislation(legislationMatches),
      }])
      .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, usedLegislation: toTraceableLegislation(legislationMatches) });
  } catch (error: any) {
    console.error('Generate Draft Error:', error);
    res.status(500).json({ error: error.message || 'Internal Server Error' });
  }
};

const ANGARYA_SYSTEM_PROMPT = `
Sen uzman bir Türk avukatısın. Sana verilen dosya bilgilerine göre, standart, resmî ve kısa bir dilekçe TASLAĞI oluşturacaksın.
Bu işlem "hızlı angarya" işlemi olduğu için hiçbir hukuki tartışmaya girme.
Sadece doğru mahkeme adını, esas numarasını, tarafı ve vekil adını yerleştirip netice-i talebi yaz.

Dilekçe Türüne Göre İstenen Metin:
1. "Süre Tutum": Gerekçeli kararın tebliğine kadar istinaf/temyiz süresinin tutulduğuna dair standart kısa dilekçe.
2. "Mazeret": "Mesleki mazeretim (başka bir duruşmamla çakışması) nedeniyle bugünkü duruşmaya katılamıyorum, mazeretimin kabulüne..." içerikli standart kısa dilekçe.
3. "Vekaletname Sunma": "Ekte sunduğumuz onaylı vekaletname uyarınca dosyanıza vekil olarak kabulümüzü talep ederiz." içerikli standart kısa dilekçe.

ÖNEMLİ: Markdown biçimlendirmesi (**, ##, -, *) ASLA kullanma.
Başlık/vurgu için sadece BÜYÜK HARF kullan.
Dilekçenin başına her zaman ilgili MAHKEME ADI ve ESAS NO ekle.
Sadece dilekçe metnini döndür, ek yorum yapma.
`;

export const generateAngarya = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const { case_id, type, client_role } = req.body || {};
    const userId = req.user?.id;

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

    const validTypes = {
      'sure-tutum': 'Süre Tutum Dilekçesi',
      'mazeret': 'Mazeret Dilekçesi',
      'vekalet': 'Vekaletname Sunma Dilekçesi'
    };
    
    const petitionType = validTypes[type as keyof typeof validTypes];
    if (!petitionType) {
      return res.status(400).json({ error: 'Geçersiz angarya türü.' });
    }

    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 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ş';

    let userContent = `DOSYA BİLGİLERİ:\nDosya: ${caseRow.title}\nTaraflar: ${partiesText}\n`;
    if (client_role) {
      userContent += `Müvekkil (Bizim Tarafımız): ${client_role}\n`;
    }
    userContent += `\nİstenen Dilekçe: ${petitionType}\nLütfen sadece bu bilgileri kullanarak yukarıda tarif edilen standart ${petitionType} metnini oluştur.`;

    // Fast generation using a lightweight model or quick params
    const { aiContent, aiModel } = await callAiModelRaw(ANGARYA_SYSTEM_PROMPT, userContent, 500);

    const { data: draftRecord, error: draftError } = await supabase
      .from('drafts')
      .insert([{
        user_id: userId,
        case_id,
        petition_type: petitionType,
        content: aiContent,
        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: false });
  } catch (error: any) {
    console.error('Generate Angarya Error:', error);
    res.status(500).json({ error: error.message || 'Internal Server Error' });
  }
};
