import type { SavedLayoutRecord } from '../../../views/play/layoutStorage';
import type { LayoutInteractionRule } from './featureMenu.types';

function normalizeText(value: unknown) {
  return typeof value === 'string' ? value.trim() : '';
}

export function normalizeLayoutInteractions(tree: unknown) {
  if (!tree || typeof tree !== 'object') {
    return [] as LayoutInteractionRule[];
  }

  const candidate = tree as { interactions?: unknown };
  if (!Array.isArray(candidate.interactions)) {
    return [];
  }

  return candidate.interactions
    .map((item) => {
      if (!item || typeof item !== 'object') {
        return null;
      }

      const next = item as Record<string, unknown>;
      const id = normalizeText(next.id);

      if (!id) {
        return null;
      }

      return {
        id,
        title: normalizeText(next.title),
        description: typeof next.description === 'string' ? next.description : '',
        implementationNotes: typeof next.implementationNotes === 'string' ? next.implementationNotes : '',
      };
    })
    .filter((item): item is LayoutInteractionRule => item !== null);
}

export function buildFeatureMenuPrompt(layout: SavedLayoutRecord, rules: LayoutInteractionRule[]) {
  const normalizedRules = rules.filter((rule) => rule.title.trim() && rule.description.trim());

  if (normalizedRules.length === 0) {
    return `${layout.name} 레이아웃에는 아직 실행할 기능설명 항목이 없습니다.`;
  }

  const featureBody = normalizedRules
    .map((rule, index) => {
      const sections = [`${index + 1}. 기능 제목: ${rule.title.trim()}`, `설명: ${rule.description.trim()}`];

      if (rule.implementationNotes.trim()) {
        sections.push(`관련 설명: ${rule.implementationNotes.trim()}`);
      }

      sections.push('이 항목에 필요한 React UI, 상태 연결, API 연동만 구현하고 다른 기능은 건드리지 마세요.');
      return sections.join('\n');
    })
    .join('\n\n');

  return [
    `레이아웃 이름: ${layout.name}`,
    '아래 기능설명 기준으로 실제 메뉴 화면 구현을 진행해 주세요.',
    '실제 개발이 진행되면 설계문서 전체 최종본은 src/features/layout/feature-menu/resources/feature-menu-final.md에 함께 반영해 주세요.',
    '설명 문구를 화면에 그대로 노출하지 말고 동작 구현에만 사용해 주세요.',
    '기능설명 입력과 관련 설명은 같은 본문에 섞지 말고 탭으로 구분해 주세요.',
    '상시 노출 액션 버튼은 문구 없이 아이콘만 사용하고 tooltip과 aria-label로 의미를 보완해 주세요.',
    '저장된 레이아웃 구조와 pane 수는 유지하세요.',
    '요구사항:',
    featureBody,
  ].join('\n');
}
