/**
 * AI গল্পকার — generates a short, kid-safe moral story from a topic.
 * Falls back to curated stories in DEMO_MODE / without an AI key.
 * Server-only.
 */
import { canUseAi } from '../env';
import type { AgeBand } from '../types';
import { callModel, extractJsonArray } from './provider';
import { storyPrompt, SAFETY_RULES } from './prompts';
import { moderateInput, moderateOutput } from './moderation';

export interface Story {
  title: string;
  body: string;
}

const FALLBACK: Story[] = [
  {
    title: 'সাহসী ছোট্ট পিঁপড়া',
    body: 'একদিন এক ছোট্ট পিঁপড়া দেখল বন্ধুরা খাবার বইতে পারছে না। সে থেমে না গিয়ে একটু একটু করে সাহায্য করল। সবাই মিলে কাজটা শেষ করল। শিক্ষা: ছোট হলেও চেষ্টা করলে বড় কাজ হয়।',
  },
  {
    title: 'সত্যবাদী রিয়া',
    body: 'রিয়া খেলতে গিয়ে ভুলে ফুলদানি ভেঙে ফেলল। ভয় পেলেও সে মাকে সত্যি কথা বলল। মা তাকে জড়িয়ে ধরে বললেন, সত্যি বলার জন্য তুমি সাহসী। শিক্ষা: সত্যি বললে মন হালকা থাকে।',
  },
  {
    title: 'ভাগ করে নেওয়া আনন্দ',
    body: 'ছোট্ট তমাল তার আম বন্ধুর সাথে ভাগ করে খেল। বন্ধুও পরদিন তার সাথে বিস্কুট ভাগ করল। দুজনেই খুব খুশি হলো। শিক্ষা: ভাগ করে নিলে আনন্দ বেড়ে যায়।',
  },
];

function pickFallback(topic: string): Story {
  let h = 0;
  for (let i = 0; i < topic.length; i += 1) h = (h + topic.charCodeAt(i)) % FALLBACK.length;
  return FALLBACK[h];
}

export async function generateStory(topic: string, band: AgeBand): Promise<Story> {
  const clean = (topic || 'বন্ধুত্ব').trim().slice(0, 60);

  // Moderate the child's topic first.
  const mod = moderateInput(clean);
  if (!mod.safe) {
    return { title: 'অন্য একটা গল্প', body: pickFallback('safe').body };
  }

  if (!canUseAi()) {
    return pickFallback(clean);
  }

  try {
    const text = await callModel(storyPrompt(clean, band), { system: SAFETY_RULES, maxTokens: 700 });
    const parsed = extractJsonArray(text);
    const first = Array.isArray(parsed) ? parsed[0] : null;
    if (first?.title && first?.body) {
      const out = moderateOutput(String(first.body));
      if (out.safe) return { title: String(first.title).slice(0, 80), body: String(first.body) };
    }
  } catch (err) {
    console.error('[ai/story] failed, using fallback:', err);
  }
  return pickFallback(clean);
}
