'use server';

import { promises as fs } from 'fs';
import path from 'path';
import type { UrlCategory, UrlItem } from './TestUrlsClient';

// 아이콘 매핑 (Lucide 아이콘 이름 사용 - 이모지는 Chrome DevTools MCP에서 JSON 직렬화 오류 발생)
const iconMap: Record<string, string> = {
  '기본': 'Home',
  '인사관리': 'Users',
  'HR': 'Users',
  '판매관리': 'DollarSign',
  'Sales': 'DollarSign',
  '기준정보관리': 'Package',
  'Master Data': 'Package',
  '생산관리': 'Factory',
  'Production': 'Factory',
  '자재관리': 'Boxes',
  'Material': 'Boxes',
  '품질관리': 'FlaskConical',
  'Quality': 'FlaskConical',
  '출고관리': 'PackageCheck',
  'Outbound': 'PackageCheck',
  '설정': 'Settings',
  'Settings': 'Settings',
  '전자결재': 'FileText',
  'Approval': 'FileText',
  '회계관리': 'Wallet',
  'Accounting': 'Wallet',
  '게시판': 'ClipboardList',
  'Board': 'ClipboardList',
  '보고서': 'BarChart3',
  'Reports': 'BarChart3',
  '계정': 'User',
  '회사': 'Building2',
  '구독': 'CreditCard',
  '고객센터': 'Headphones',
  'Customer': 'Headphones',
};

function getIcon(title: string): string {
  for (const [key, icon] of Object.entries(iconMap)) {
    if (title.includes(key)) return icon;
  }
  return 'FileText';
}

// 이모지를 텍스트로 변환 (Chrome DevTools MCP JSON 직렬화 오류 방지)
function convertEmojiToText(text: string): string {
  // 먼저 특정 이모지를 의미있는 텍스트로 변환
  let result = text
    .replace(/✅/g, '[완료]')
    .replace(/⚠️?/g, '[주의]')
    .replace(/🧪/g, '[테스트]')
    .replace(/🆕/g, '[NEW]')
    .replace(/•/g, '-');

  // 나머지 모든 이모지 및 특수 유니코드 문자 제거
  // Unicode emoji 범위와 variation selectors 제거
  result = result
    .replace(/[\u{1F300}-\u{1F9FF}]/gu, '') // 이모지 범위
    .replace(/[\u{2600}-\u{26FF}]/gu, '')   // 기타 기호
    .replace(/[\u{2700}-\u{27BF}]/gu, '')   // 딩뱃
    .replace(/[\u{FE00}-\u{FE0F}]/gu, '')   // Variation Selectors
    .replace(/[\u{1F000}-\u{1F02F}]/gu, '') // 마작 타일
    .replace(/[\u{1F0A0}-\u{1F0FF}]/gu, '') // 플레잉 카드
    .replace(/[\u200D]/g, '')               // Zero Width Joiner
    .trim();

  return result;
}

function parseTableRow(line: string): UrlItem | null {
  // | 페이지 | URL | 상태 | 형식 파싱
  const parts = line.split('|').map(p => p.trim()).filter(p => p);

  if (parts.length < 2) return null;
  if (parts[0] === '페이지' || parts[0].startsWith('---')) return null;

  const name = convertEmojiToText(parts[0].replace(/\*\*/g, '')); // **bold** 제거 + 이모지 변환
  const url = parts[1].replace(/`/g, ''); // backtick 제거
  const rawStatus = parts[2] || '';
  const status = convertEmojiToText(rawStatus) || undefined;

  // URL이 /ko로 시작하는지 확인
  if (!url.startsWith('/ko')) return null;

  return { name, url, status };
}

function parseMdFile(content: string): { categories: UrlCategory[]; lastUpdated: string } {
  const lines = content.split('\n');
  const categories: UrlCategory[] = [];
  let currentCategory: UrlCategory | null = null;
  let currentSubCategory: { title: string; items: UrlItem[] } | null = null;
  let lastUpdated = 'N/A';

  // Last Updated 추출
  const updateMatch = content.match(/Last Updated:\s*(\d{4}-\d{2}-\d{2})/);
  if (updateMatch) {
    lastUpdated = updateMatch[1];
  }

  for (let i = 0; i < lines.length; i++) {
    const line = lines[i].trim();

    // ## 카테고리 (메인 섹션)
    if (line.startsWith('## ') && !line.includes('클릭 가능한') && !line.includes('전체 URL') && !line.includes('백엔드 메뉴')) {
      // 이전 카테고리 저장
      if (currentCategory) {
        if (currentSubCategory) {
          currentCategory.subCategories = currentCategory.subCategories || [];
          currentCategory.subCategories.push(currentSubCategory);
          currentSubCategory = null;
        }
        categories.push(currentCategory);
      }

      const title = convertEmojiToText(line.replace('## ', ''));
      currentCategory = {
        title,
        icon: getIcon(title),
        items: [],
        subCategories: [],
      };
      currentSubCategory = null;
    }

    // ### 서브 카테고리
    else if (line.startsWith('### ') && currentCategory) {
      // 이전 서브카테고리 저장
      if (currentSubCategory) {
        currentCategory.subCategories = currentCategory.subCategories || [];
        currentCategory.subCategories.push(currentSubCategory);
      }

      const subTitle = convertEmojiToText(line.replace('### ', ''));
      // "메인 페이지"는 서브카테고리가 아니라 메인 아이템으로
      if (subTitle === '메인 페이지') {
        currentSubCategory = null;
      } else {
        currentSubCategory = {
          title: subTitle,
          items: [],
        };
      }
    }

    // 테이블 행 파싱
    else if (line.startsWith('|') && currentCategory) {
      const item = parseTableRow(line);
      if (item) {
        if (currentSubCategory) {
          currentSubCategory.items.push(item);
        } else {
          currentCategory.items.push(item);
        }
      }
    }
  }

  // 마지막 카테고리 저장
  if (currentCategory) {
    if (currentSubCategory) {
      currentCategory.subCategories = currentCategory.subCategories || [];
      currentCategory.subCategories.push(currentSubCategory);
    }
    categories.push(currentCategory);
  }

  // 빈 서브카테고리 제거
  categories.forEach(cat => {
    cat.subCategories = cat.subCategories?.filter(sub => sub.items.length > 0);
  });

  return { categories, lastUpdated };
}

export async function getTestUrlsData(): Promise<{ categories: UrlCategory[]; lastUpdated: string }> {
  // md 파일 경로
  const mdFilePath = path.join(
    process.cwd(),
    'claudedocs',
    'dev',
    '[REF] all-pages-test-urls.md'
  );

  try {
    const fileContent = await fs.readFile(mdFilePath, 'utf-8');
    return parseMdFile(fileContent);
  } catch (error) {
    console.error('Failed to read md file:', error);
    return { categories: [], lastUpdated: 'N/A' };
  }
}
