import { createHash } from 'crypto';

// ---------------------------------------------------------------------------
// Layer 1: Prompt Injection 탐지 패턴
// ---------------------------------------------------------------------------

const INJECTION_PATTERN =
  /ignore.*instructions|system.*prompt|you are now|act as|새로운 지시|지시를 무시/i;

/** Layer 1: Prompt injection 패턴 감지 */
export function detectInjection(query: string): boolean {
  return INJECTION_PATTERN.test(query);
}

/** Layer 2: query sanitize – HTML 태그 제거 + 1000자 제한 */
export function sanitizeQuery(query: string): string {
  return query.replace(/<[^>]*>/g, '').slice(0, 1000);
}

/** SHA-256 해시 (캐시 키로 사용) */
export function hashQuery(query: string): string {
  return createHash('sha256').update(query).digest('hex');
}

// ---------------------------------------------------------------------------
// 검색 결과 타입
// ---------------------------------------------------------------------------

export interface SearchResult {
  id: string;
  title: string;
  snippet: string;
}

// ---------------------------------------------------------------------------
// 캐시 TTL
// ---------------------------------------------------------------------------

export const CACHE_TTL_SECONDS = 3600;

// ---------------------------------------------------------------------------
// 캐시 조회
// ---------------------------------------------------------------------------

interface CacheDoc {
  query: string;
  summary: string;
  sourceDocIds: string[];
  createdAt: { seconds: number };
}

export async function getCachedSummary(
  db: FirebaseFirestore.Firestore,
  queryHash: string
): Promise<{ summary: string; sourceDocIds: string[] } | null> {
  const docRef = db.collection('search_summary_cache').doc(queryHash);
  const snap = await docRef.get();

  if (!snap.exists) return null;

  const data = snap.data() as CacheDoc;
  const createdAtSec = data.createdAt?.seconds ?? 0;
  const nowSec = Math.floor(Date.now() / 1000);

  if (createdAtSec + CACHE_TTL_SECONDS > nowSec) {
    return { summary: data.summary, sourceDocIds: data.sourceDocIds };
  }

  return null; // 캐시 만료
}

// ---------------------------------------------------------------------------
// 출처 섹션 보정
// ---------------------------------------------------------------------------

/** 응답에 출처 표기([ 문자)가 없으면 검색 결과 기반 출처 섹션 자동 추가 */
export function ensureSourceCitations(
  summary: string,
  results: SearchResult[]
): string {
  if (summary.includes('[')) return summary;

  const sourceSection =
    '\n\n**출처**\n' +
    results.map((r) => `- [${r.title}]`).join('\n');

  return summary + sourceSection;
}

// ---------------------------------------------------------------------------
// User Prompt 빌더
// ---------------------------------------------------------------------------

export function buildUserPrompt(query: string, results: SearchResult[]): string {
  const resultText = results
    .map((r, i) => `[${i + 1}] 제목: ${r.title}\n내용: ${r.snippet}`)
    .join('\n\n');

  return (
    `검색어: ${query}\n\n` +
    `검색 결과 ${results.length}건을 아래에 제공합니다. ` +
    `각 사실에 반드시 [문서제목] 형태로 출처를 명시하여 종합 정리해주세요.\n\n` +
    resultText
  );
}
