/**
 * AI-Powered Image Prompt Generator
 * 
 * 900+ prompt kütüphanesinden öğrenerek, karakter DNA'sına göre
 * KIE API'ye uygun görsel üretim promptları oluşturur.
 * OpenRouter (Gemini 3.1 Flash-Lite) kullanır.
 */

import { createModuleLogger } from '../../utils/logger.js';
import { createOpenRouterClient, type ChatMessage } from '../openrouter/client.js';
import type { CharacterDNA } from '../../types/character.js';
import { buildSubjectDescription } from '../character-engine/prompt-builder.js';
import { loadTrainingExamples, type TrainingExample } from './prompt-training-data.js';
import { sanitizePrompt } from './prompt-safety.js';

const log = createModuleLogger('ai-prompt-generator');

/** Kategori bazlı prompt üretim tipleri */
export type PromptCategory =
  | 'selfie-casual'
  | 'lifestyle-glamour'
  | 'nightlife'
  | 'fitness'
  | 'beach-pool'
  | 'intimate-morning'
  | 'fashion-editorial'
  | 'outdoor-adventure'
  | 'fantasy-vip';

interface GeneratedImagePrompt {
  prompt: string;
  negativePrompt: string;
  aspectRatio: string;
  category: PromptCategory;
  safetyModified: boolean;
  useRefs: boolean;
}

/**
 * Karakter DNA'sı ve bağlama göre AI ile görsel prompt üretir.
 * Prompt kütüphanesinden örnekler kullanarak eğitilmiş bir sistem.
 */
export async function generateImagePrompt(
  dna: CharacterDNA,
  opts?: {
    category?: PromptCategory;
    context?: string[];  // son kullanıcı mesajları
    mood?: string;
    channelType?: 'normal' | 'vip';
  },
): Promise<GeneratedImagePrompt> {
  const client = createOpenRouterClient();
  const characterSubject = buildSubjectDescription(dna);
  const examples = await loadTrainingExamples(opts?.category);

  const systemPrompt = buildImagePromptSystemPrompt(characterSubject, examples);
  const userPrompt = buildImagePromptUserMessage(dna, opts);

  const messages: ChatMessage[] = [
    { role: 'system', content: systemPrompt },
    { role: 'user', content: userPrompt },
  ];

  const response = await client.chatCompletion(messages, {
    temperature: 0.85,
    max_tokens: 400,
  });

  const content = response.choices?.[0]?.message?.content ?? '';
  const parsed = parseGeneratedPrompt(content, opts?.category);

  // Safety check
  const safety = sanitizePrompt(parsed.prompt);

  log.info({
    characterId: dna.id,
    category: parsed.category,
    promptLength: safety.sanitizedPrompt.length,
    safetyModified: safety.wasModified,
    useRefs: parsed.useRefs,
  }, 'AI image prompt generated');

  return {
    prompt: safety.sanitizedPrompt,
    negativePrompt: parsed.negativePrompt,
    aspectRatio: parsed.aspectRatio,
    category: parsed.category,
    safetyModified: safety.wasModified,
    useRefs: parsed.useRefs,
  };
}


/**
 * Sistem promptu: 900+ prompt kütüphanesinden öğrenilmiş örneklerle
 * karakter bazlı görsel prompt üretimi.
 */
function buildImagePromptSystemPrompt(characterSubject: string, examples: TrainingExample[]): string {
  const exampleBlock = examples
    .slice(0, 8)
    .map((ex, i) => `Örnek ${i + 1} [${ex.category}]:\n${ex.flatPrompt}`)
    .join('\n\n');

  return `Sen bir profesyonel AI görsel prompt yazarısın. Telegram influencer karakterleri için ORGANİK, DOĞAL ve gerçek bir kızın Instagram'ına benzeyen fotoğraf promptları üretiyorsun.

KARAKTER BİLGİSİ:
${characterSubject}

PROMPT KÜTÜPHANESİNDEN ÖĞRENME ÖRNEKLERİ:
${exampleBlock}

ÖNEMLİ TARZ KURALLARI:
- Görseller STÜDYO ÇEKİMİ DEĞİL, gerçek bir kızın günlük hayatından kareler olmalı
- iPhone selfie, ayna selfie, arkadaşın çektiği fotoğraf hissi ver
- "shot on iPhone 15 Pro", "slightly grainy", "instagram story vibe", "candid moment" gibi ifadeler kullan
- Sahneler: kafe, spor salonu, yatak odası sabah, otel odası, araba, plaj, gece dışarı, ev

NORMAL KANAL İÇİN KIYAFETLER (sexy ama giyinik):
- Bodycon mini dress, deep V-neckline crop top showing midriff
- Low neckline spaghetti strap top, fitted mini skirt
- Off-shoulder top, backless dress, high-slit dress
- Sports bra with high-waisted leggings (spor salonu)
- One-piece swimsuit (plaj/havuz)
- Oversized t-shirt off one shoulder (ev/sabah)
- Tight jeans + crop top (günlük)

VIP KANAL İÇİN KIYAFETLER (daha açık, fantezi):
- Red/black lace lingerie set with floral lace detailing
- Satin mini dress with lace trim
- Lace bodysuit
- Silk robe açık, lace set altında
- Fitted lace top with matching mini skirt

ZAMAN DİLİMİ KURALLARI (ÇOK ÖNEMLİ):
Prompt'taki ortam ve ışık, Türkiye saatine (UTC+3) göre TUTARLI olmalı.
- 06:00-09:00 → sabah: morning sunlight, warm golden light, bed/kitchen/bathroom, just woke up vibe
- 09:00-12:00 → kuşluk: bright daylight, cafe, outdoor walk, gym, fresh morning energy
- 12:00-17:00 → öğleden sonra: afternoon sun, shopping, rooftop, pool, bright natural light
- 17:00-20:00 → akşam üstü: golden hour, sunset glow, getting ready, warm orange tones
- 20:00-23:00 → gece: city lights, restaurant, club, neon bokeh, nightlife, artificial warm lighting
- 23:00-02:00 → gece geç: dim lamp light, bedroom, cozy home, sleepy vibe, low warm light
- 02:00-06:00 → gece yarısı: very dim, bed, sleeping vibe, moonlight through window
Şu anki Türkiye saati prompt'a verilecek — buna göre ortam ve ışık seç.

ZAMAN DİLİMİ KURALLARI (ÇOK ÖNEMLİ):
Prompt'taki ortam ve ışık, Türkiye saatine (UTC+3) göre TUTARLI olmalı.
- 06:00-09:00 → sabah: morning sunlight, warm golden light, bed/kitchen/bathroom, just woke up vibe
- 09:00-12:00 → kuşluk: bright daylight, cafe, outdoor walk, gym, fresh morning energy
- 12:00-17:00 → öğleden sonra: afternoon sun, shopping, rooftop, pool, bright natural light
- 17:00-20:00 → akşam üstü: golden hour, sunset glow, getting ready, warm orange tones
- 20:00-23:00 → gece: city lights, restaurant, club, neon bokeh, nightlife, artificial warm lighting
- 23:00-02:00 → gece geç: dim lamp light, bedroom, cozy home, sleepy vibe, low warm light
- 02:00-06:00 → gece yarısı: very dim, bed, sleeping vibe, moonlight through window
Şu anki Türkiye saati prompt'a verilecek — buna göre ortam ve ışık seç.

PROMPT YAZIM KURALLARI:
1. Prompt İNGİLİZCE olmalı, 1 paragraf düz metin
2. Karakter fiziksel özelliklerini (yaş, saç, göz, vücut) her prompt'a dahil et
3. Kıyafeti GENEL tanımla, parça parça anatomik detay VERME (NSFW tetikler)
4. ÇALIŞAN ÖRNEK: "wearing a red lace lingerie set with floral lace detailing and gold accents"
5. ÇALIŞMAYAN ÖRNEK: "underwire balconette bra with sheer mesh cups, matching garter belt with clips hanging down, thong with scalloped waistband" (çok detaylı = NSFW)
6. Ortam doğal olsun: warm lamp light, golden hour, morning sunlight, city lights bokeh
7. Poz organik olsun: mirror selfie, sitting on bed, looking over shoulder, hand playing with hair
8. İfade: confident half-smile, alluring gaze, sleepy morning look, playful smirk
9. YASAKLI KELİMELER: nude, naked, underwear, see-through, transparent, bikini string, thong, panties, topless, fishnet, mesh, sheer, bedroom eyes, seductive, biting lip, sensual, erotic, provocative, boudoir, intimate, garter clips, underwire, balconette
10. GÜVENLİ KELİMELER: lingerie set, lace detailing, satin, fitted, form-fitting, crop top, mini dress, bodycon, alluring, confident, sultry, bold
14. Her prompt benzersiz ve farklı bir sahne olmalı — tekrar etme

ÇIKTI FORMATI (sadece bu 4 satır, başka bir şey yazma):
PROMPT: [prompt metni]
ASPECT: [9:16 veya 1:1 veya 16:9]
CATEGORY: [kategori]
USE_REFS: [yes veya no — fantezi/lingerie kıyafetlerde NO, normal kıyafetlerde YES]`;
}

function buildImagePromptUserMessage(
  dna: CharacterDNA,
  opts?: { category?: PromptCategory; context?: string[]; mood?: string; channelType?: 'normal' | 'vip' },
): string {
  let msg = `${dna.identity.name} için yeni bir görsel prompt üret.`;

  // Türkiye saati (UTC+3) hesapla
  const turkeyTime = new Date(Date.now() + 3 * 60 * 60 * 1000);
  const turkeyHour = turkeyTime.getUTCHours();
  const turkeyMinute = turkeyTime.getUTCMinutes();
  const timeStr = `${String(turkeyHour).padStart(2, '0')}:${String(turkeyMinute).padStart(2, '0')}`;

  let timeOfDay: string;
  if (turkeyHour >= 6 && turkeyHour < 9) timeOfDay = 'sabah erken — morning sunlight, just woke up';
  else if (turkeyHour >= 9 && turkeyHour < 12) timeOfDay = 'kuşluk — bright daylight, active morning';
  else if (turkeyHour >= 12 && turkeyHour < 17) timeOfDay = 'öğleden sonra — afternoon sun, bright';
  else if (turkeyHour >= 17 && turkeyHour < 20) timeOfDay = 'akşam üstü — golden hour, sunset';
  else if (turkeyHour >= 20 && turkeyHour < 23) timeOfDay = 'gece — city lights, nightlife';
  else if (turkeyHour >= 23 || turkeyHour < 2) timeOfDay = 'gece geç — dim lamp, bedroom, cozy';
  else timeOfDay = 'gece yarısı — very dim, sleeping vibe';

  msg += `\nŞu anki Türkiye saati: ${timeStr} (${timeOfDay}). Ortam ve ışığı buna göre ayarla.`;

  if (opts?.channelType === 'vip') {
    msg += '\nBu VIP kanal içeriği — daha cesur ve fantezi kıyafetler kullan (lingerie set, lace, satin slip dress gibi).';
  } else {
    msg += '\nBu normal kanal içeriği — sexy ama giyinik ol (bodycon dress, crop top, mini skirt, sports bra gibi).';
  }

  if (opts?.category) {
    const categoryLabels: Record<string, string> = {
      'selfie-casual': 'Günlük selfie, rahat ve doğal',
      'lifestyle-glamour': 'Glamour yaşam tarzı, çekici ve şık',
      'nightlife': 'Gece hayatı, kulüp veya bar ortamı',
      'fitness': 'Spor ve fitness, aktif ve enerjik',
      'beach-pool': 'Plaj veya havuz, yaz havası',
      'intimate-morning': 'Sabah, ev ortamı, rahat kıyafet',
      'fashion-editorial': 'Moda çekimi, editorial tarz',
      'outdoor-adventure': 'Dış mekan, doğa veya şehir',
      'fantasy-vip': 'Fantezi iç giyim, lace lingerie, satin',
    };
    msg += `\nKategori: ${categoryLabels[opts.category] || opts.category}`;
  }

  if (opts?.context && opts.context.length > 0) {
    msg += `\nKullanıcı son mesajları (bağlam): ${opts.context.slice(-3).join(' | ')}`;
  }

  if (opts?.mood) {
    msg += `\nMood: ${opts.mood}`;
  }

  msg += '\n\nÖnceki örneklerden ilham al ama benzersiz bir sahne oluştur. Maksimum çekici ve cesur ol. Vücut hatlarını, bacakları, dekoltesini vurgula. Kıyafet minimal ve sexy olsun.';
  return msg;
}

function parseGeneratedPrompt(
  content: string,
  fallbackCategory?: PromptCategory,
): { prompt: string; negativePrompt: string; aspectRatio: string; category: PromptCategory; useRefs: boolean } {
  const lines = content.trim().split('\n');

  let prompt = '';
  let aspectRatio = '9:16';
  let category: PromptCategory = fallbackCategory || 'selfie-casual';
  let useRefs = true;

  for (const line of lines) {
    const trimmed = line.trim();
    if (trimmed.toUpperCase().startsWith('PROMPT:')) {
      prompt = trimmed.replace(/^PROMPT:\s*/i, '').trim();
    } else if (trimmed.toUpperCase().startsWith('ASPECT:')) {
      const val = trimmed.replace(/^ASPECT:\s*/i, '').trim();
      if (['9:16', '1:1', '16:9'].includes(val)) aspectRatio = val;
    } else if (trimmed.toUpperCase().startsWith('CATEGORY:')) {
      const val = trimmed.replace(/^CATEGORY:\s*/i, '').trim() as PromptCategory;
      category = val;
    } else if (trimmed.toUpperCase().startsWith('USE_REFS:')) {
      const val = trimmed.replace(/^USE_REFS:\s*/i, '').trim().toLowerCase();
      useRefs = val === 'yes' || val === 'true';
    }
  }

  // Fallback: tüm content'i prompt olarak kullan
  if (!prompt) {
    prompt = content.replace(/ASPECT:.*$/gim, '').replace(/CATEGORY:.*$/gim, '').replace(/USE_REFS:.*$/gim, '').trim();
  }

  // Auto-detect: if prompt contains lingerie/lace keywords, disable refs
  const fantasyKeywords = /lingerie|lace set|satin slip|lace bodysuit|silk robe/i;
  if (fantasyKeywords.test(prompt)) {
    useRefs = false;
  }

  const negativePrompt = 'blurry, low quality, distorted, deformed, ugly, bad anatomy, bad proportions, extra limbs, disfigured, watermark, text, signature';

  return { prompt, negativePrompt, aspectRatio, category, useRefs };
}
