/**
 * 작동하는 TXT → PPTX 변환기 (컬러 오류 수정 버전)
 */

const fs = require('fs').promises;
const PptxGenJS = require('pptxgenjs');

// 간단한 텍스트 분석 클래스
class TextAnalyzer {
  constructor() {
    this.patterns = {
      metadata: /^(.+?):[\s]*(.+)$/,
      section: /^=== (.+) ===/,
      heading: /^[가-힣A-Za-z].+[가-힣A-Za-z\d]$/,  // 한글로 시작하고 끝나는 제목
      numbered_item: /^\d+\.\s*(.+)$/,
      bullet_item: /^[•\-\*]\s*(.+)$/,
      html_tag: /<[^>]+>/g
    };
  }

  /**
   * TXT 파일 분석
   */
  async analyzeFile(filePath) {
    console.log(`📖 텍스트 파일 분석 중: ${filePath}`);

    const content = await fs.readFile(filePath, 'utf8');
    const lines = content.split('\n');

    const result = {
      metadata: {},
      sections: new Map()
    };

    let currentSection = null;
    let currentContent = [];

    // 첫 번째 라인을 제목으로 사용
    if (lines.length > 0) {
      result.metadata.title = lines[0].trim();
    }

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

      // HTML 태그 제거
      const cleanLine = trimmedLine.replace(this.patterns.html_tag, '');
      if (!cleanLine.trim()) continue;

      // 메타데이터 파싱 (처음 3줄 이내)
      if (i < 3) {
        const metaMatch = cleanLine.match(this.patterns.metadata);
        if (metaMatch && !currentSection) {
          const key = metaMatch[1].toLowerCase().replace(/[^\w]/g, '_');
          result.metadata[key] = metaMatch[2];
          continue;
        }
      }

      // 섹션 제목 (=== 형태)
      const sectionMatch = cleanLine.match(this.patterns.section);
      if (sectionMatch) {
        // 이전 섹션 저장
        if (currentSection) {
          result.sections.set(currentSection, {
            title: currentSection,
            content: currentContent.join('\n')
          });
        }

        currentSection = sectionMatch[1];
        currentContent = [];
        continue;
      }

      // 한글 제목 패턴 (bullet point나 HTML이 아닌 경우)
      if (!cleanLine.startsWith('•') &&
          !cleanLine.startsWith('-') &&
          !cleanLine.startsWith('<') &&
          cleanLine.length > 5 &&
          cleanLine.length < 100 &&
          this.patterns.heading.test(cleanLine)) {

        // 이전 섹션 저장
        if (currentSection) {
          result.sections.set(currentSection, {
            title: currentSection,
            content: currentContent.join('\n')
          });
        }

        currentSection = cleanLine;
        currentContent = [];
        continue;
      }

      // 현재 섹션에 내용 추가
      if (currentSection) {
        currentContent.push(cleanLine);
      } else if (!currentSection && i > 2) {
        // 섹션이 없으면 "개요"로 시작
        currentSection = "개요";
        currentContent = [cleanLine];
      }
    }

    // 마지막 섹션 저장
    if (currentSection) {
      result.sections.set(currentSection, {
        title: currentSection,
        content: currentContent.join('\n')
      });
    }

    // 기본값 설정
    if (!result.metadata.title) result.metadata.title = 'TXT 변환 프레젠테이션';
    if (!result.metadata.date) result.metadata.date = new Date().toISOString().split('T')[0];
    if (!result.metadata.company) result.metadata.company = 'Generated by TXT→PPTX';

    console.log(`✅ 분석 완료: ${result.sections.size}개 섹션 발견`);
    return result;
  }
}

// PPTX 생성 클래스
class PPTXGenerator {
  constructor() {
    this.pptx = new PptxGenJS();
    this.pptx.layout = 'LAYOUT_16x9';
    this.slideNumber = 1;
  }

  /**
   * 분석된 데이터로부터 PPTX 생성
   */
  async generateFromAnalysis(analysisResult) {
    console.log('📊 PPTX 생성 중...');

    const { metadata, sections } = analysisResult;

    // 1. 표지 슬라이드
    this.createCoverSlide(metadata);

    // 2. 목차 슬라이드
    this.createTableOfContents(sections);

    // 3. 각 섹션별 슬라이드
    for (const [sectionName, sectionData] of sections) {
      this.createSectionSlide(sectionName, sectionData);
    }

    return this.pptx;
  }

  /**
   * 표지 슬라이드 생성
   */
  createCoverSlide(metadata) {
    const slide = this.pptx.addSlide();

    // 배경 색상
    slide.background = { color: '8BC34A' };

    // 프로젝트 제목
    slide.addText(metadata.title || 'TXT 변환 프레젠테이션', {
      x: 1, y: 3, w: 8, h: 1.5,
      fontSize: 36,
      bold: true,
      color: 'FFFFFF',
      align: 'center'
    });

    // 부제목
    slide.addText('시스템 기획 및 설계서', {
      x: 1, y: 4.8, w: 8, h: 0.8,
      fontSize: 20,
      color: 'FFFFFF',
      align: 'center'
    });

    // 날짜 및 회사정보
    const infoText = `${metadata.date}\n\n${metadata.company}`;
    slide.addText(infoText, {
      x: 7.5, y: 7, w: 2.5, h: 1.5,
      fontSize: 12,
      color: 'FFFFFF',
      align: 'right'
    });

    console.log(`✅ 슬라이드 ${this.slideNumber}: 표지`);
    this.slideNumber++;
  }

  /**
   * 목차 슬라이드 생성
   */
  createTableOfContents(sections) {
    const slide = this.pptx.addSlide();

    slide.addText('목차', {
      x: 0.5, y: 0.5, w: 9, h: 0.8,
      fontSize: 24,
      bold: true,
      color: '2E7D32'
    });

    let yPosition = 1.5;
    let index = 1;

    for (const [sectionName] of sections) {
      slide.addText(`${index}. ${sectionName}`, {
        x: 1, y: yPosition, w: 8, h: 0.6,
        fontSize: 16,
        color: '333333'
      });

      yPosition += 0.8;
      index++;

      if (yPosition > 6) break; // 슬라이드 범위 초과 방지
    }

    console.log(`✅ 슬라이드 ${this.slideNumber}: 목차`);
    this.slideNumber++;
  }

  /**
   * 섹션 슬라이드 생성
   */
  createSectionSlide(sectionName, sectionData) {
    const slide = this.pptx.addSlide();

    // 섹션 제목
    slide.addText(sectionName, {
      x: 0.5, y: 0.5, w: 9, h: 0.8,
      fontSize: 24,
      bold: true,
      color: '2E7D32'
    });

    // 내용 처리 (긴 내용은 잘라서 표시)
    let content = sectionData.content;
    if (content.length > 800) {
      content = content.substring(0, 800) + '...';
    }

    slide.addText(content, {
      x: 0.5, y: 1.5, w: 9, h: 4.5,
      fontSize: 14,
      color: '333333',
      lineSpacing: 20
    });

    console.log(`✅ 슬라이드 ${this.slideNumber}: ${sectionName}`);
    this.slideNumber++;
  }
}

// 메인 실행 함수
async function convertTxtToPptx(inputPath, outputPath) {
  try {
    console.log('🚀 TXT → PPTX 변환 시작');
    console.log(`📄 입력: ${inputPath}`);
    console.log(`📊 출력: ${outputPath}`);

    // 1. 텍스트 분석
    const analyzer = new TextAnalyzer();
    const analysisResult = await analyzer.analyzeFile(inputPath);

    // 2. PPTX 생성
    const generator = new PPTXGenerator();
    const pptx = await generator.generateFromAnalysis(analysisResult);

    // 3. 파일 저장
    await pptx.writeFile({ fileName: outputPath });
    console.log('✅ 변환 완료!');

  } catch (error) {
    console.error('❌ 변환 실패:', error.message);
    throw error;
  }
}

// 명령행 인수 처리
async function main() {
  const args = process.argv.slice(2);
  const inputFlag = args.find(arg => arg.startsWith('--input='));
  const outputFlag = args.find(arg => arg.startsWith('--output='));

  const inputPath = inputFlag ? inputFlag.split('=')[1] : 'source/sample_project.txt';
  const outputPath = outputFlag ? outputFlag.split('=')[1] : 'pptx/working_test.pptx';

  // 출력 디렉토리 생성
  await fs.mkdir('pptx', { recursive: true });

  await convertTxtToPptx(inputPath, outputPath);
}

// 직접 실행시
if (require.main === module) {
  main().catch(console.error);
}

module.exports = { convertTxtToPptx, TextAnalyzer, PPTXGenerator };