/**
 * 스토리보드 PPTX 자동 생성 스크립트
 * 텍스트 기반 인터뷰/기획 문서를 분석하여 IA + 화면 설계 스토리보드 생성
 *
 * 사용법:
 *   node generate-storyboard.js --input <입력파일> --output <출력파일.pptx>
 *   node generate-storyboard.js --config <설정파일.json>
 */

const PptxGenJS = require('pptxgenjs');
const fs = require('fs');
const path = require('path');

// ========================================
// 색상 팔레트 정의 (# 없이)
// ========================================
const colors = {
    primary: '0d9488',      // Teal
    secondary: '1e293b',    // Slate 800
    accent: '95C11F',       // 라임 그린 (Description용)
    warning: 'f59e0b',      // 경고
    danger: 'dc2626',       // 위험
    white: 'FFFFFF',
    lightGray: 'f1f5f9',
    darkGray: '64748b',
    black: '1a1a1a',
    wireframeBg: 'f8fafc',
    wireframeBorder: 'e2e8f0'
};

// ========================================
// 텍스트 파서 클래스
// ========================================
class TextParser {
    constructor(content) {
        this.content = content;
        this.sections = [];
        this.metadata = {};
    }

    parse() {
        this.extractMetadata();
        this.extractSections();
        this.extractMenuStructure();
        this.extractScreens();
        return this;
    }

    extractMetadata() {
        // 프로젝트명 추출
        const projectMatch = this.content.match(/프로젝트[명\s]*[:：]\s*(.+)/i) ||
                            this.content.match(/##\s*(.+?)\s*(프로젝트|시스템|기획)/i) ||
                            this.content.match(/주제[:：]\s*(.+)/i);

        if (projectMatch) {
            this.metadata.projectName = projectMatch[1].trim();
        }

        // 날짜 추출
        const dateMatch = this.content.match(/(\d{4})[.\-/년](\d{1,2})[.\-/월](\d{1,2})/);
        if (dateMatch) {
            this.metadata.date = `${dateMatch[1]}.${dateMatch[2].padStart(2, '0')}.${dateMatch[3].padStart(2, '0')}`;
        } else {
            const today = new Date();
            this.metadata.date = `${today.getFullYear()}.${String(today.getMonth() + 1).padStart(2, '0')}.${String(today.getDate()).padStart(2, '0')}`;
        }

        // 참석자/작성자 추출
        const authorMatch = this.content.match(/참석자[:：]\s*(.+)/i) ||
                           this.content.match(/작성자[:：]\s*(.+)/i);
        if (authorMatch) {
            this.metadata.author = authorMatch[1].trim();
        }
    }

    extractSections() {
        // === 섹션 === 패턴
        const sectionPattern = /===\s*(.+?)\s*===/g;
        let match;
        while ((match = sectionPattern.exec(this.content)) !== null) {
            this.sections.push({
                title: match[1].trim(),
                startIndex: match.index
            });
        }

        // ## 섹션 패턴 (Markdown)
        const mdSectionPattern = /^##\s+(.+)$/gm;
        while ((match = mdSectionPattern.exec(this.content)) !== null) {
            if (!this.sections.some(s => s.title === match[1].trim())) {
                this.sections.push({
                    title: match[1].trim(),
                    startIndex: match.index
                });
            }
        }
    }

    extractMenuStructure() {
        this.metadata.menus = [];

        // PPT 구성, 메뉴 구조 등에서 추출
        const menuPatterns = [
            /(\d+)\.\s*\*\*(.+?)\*\*/g,  // 1. **메뉴명**
            /(\d+)\.\s*(.+?)(?:\n|$)/g,   // 1. 메뉴명
            /-\s+(.+?)(?:\n|$)/g          // - 메뉴명
        ];

        // 주요 기능 섹션에서 메뉴 추출
        const funcMatch = this.content.match(/주요\s*기능[^]*?(?=##|===|$)/i);
        if (funcMatch) {
            const lines = funcMatch[0].split('\n');
            for (const line of lines) {
                const itemMatch = line.match(/^\s*[-\d.]+\s*(.+)/);
                if (itemMatch && itemMatch[1].trim().length > 0) {
                    const menuName = itemMatch[1].replace(/\*\*/g, '').trim();
                    if (menuName.length < 30) {
                        this.metadata.menus.push(menuName);
                    }
                }
            }
        }
    }

    extractScreens() {
        this.metadata.screens = [];

        // 화면 관련 키워드 추출
        const screenKeywords = ['화면', '페이지', '입력', '조회', '관리', '목록', '상세', '등록', '수정'];

        for (const keyword of screenKeywords) {
            const pattern = new RegExp(`(${keyword}[^\\n]{0,20})`, 'gi');
            let match;
            while ((match = pattern.exec(this.content)) !== null) {
                const screenName = match[1].trim();
                if (!this.metadata.screens.some(s => s.name === screenName) && screenName.length < 30) {
                    this.metadata.screens.push({ name: screenName });
                }
            }
        }
    }
}

// ========================================
// 스토리보드 생성기 클래스
// ========================================
class StoryboardGenerator {
    constructor(config) {
        this.config = config;
        this.pptx = new PptxGenJS();
        this.setupPresentation();
    }

    setupPresentation() {
        // 레이아웃 설정 (16:9)
        this.pptx.defineLayout({ name: 'CUSTOM_16x9', width: 10, height: 5.625 });
        this.pptx.layout = 'CUSTOM_16x9';

        // 메타데이터
        this.pptx.title = this.config.projectName || '웹 기획서';
        this.pptx.subject = '시스템 기획 및 UI/UX 설계';
        this.pptx.author = this.config.author || 'SAM';
        this.pptx.company = this.config.company || 'SAM';
    }

    // ----------------------------------------
    // 슬라이드 1: 표지
    // ----------------------------------------
    createCoverSlide() {
        const slide = this.pptx.addSlide();
        slide.background = { color: colors.secondary };

        // 상단 악센트 라인
        slide.addShape('rect', {
            x: 0, y: 0, w: 10, h: 0.1,
            fill: { color: colors.primary }
        });

        // 로고
        slide.addShape('rect', {
            x: 0.5, y: 0.4, w: 1.2, h: 0.5,
            fill: { color: colors.primary }
        });
        slide.addText(this.config.company || 'SAM', {
            x: 0.5, y: 0.4, w: 1.2, h: 0.5,
            fontSize: 16, bold: true, color: colors.white,
            align: 'center', valign: 'middle'
        });

        // 메인 제목
        slide.addText(this.config.projectName || '프로젝트', {
            x: 0.5, y: 1.8, w: 9, h: 0.8,
            fontSize: 40, bold: true, color: colors.white,
            align: 'center'
        });

        // 부제목
        slide.addText('웹 기획서 및 스토리보드', {
            x: 0.5, y: 2.6, w: 9, h: 0.5,
            fontSize: 22, color: colors.primary,
            align: 'center'
        });

        // 버전 정보
        slide.addText('Version D1.0', {
            x: 0.5, y: 3.3, w: 9, h: 0.3,
            fontSize: 14, color: colors.darkGray,
            align: 'center'
        });

        // 하단 정보
        slide.addText(`${this.config.date || new Date().toISOString().split('T')[0].replace(/-/g, '.')} | ${this.config.author || '기획팀'}`, {
            x: 0.5, y: 5, w: 9, h: 0.3,
            fontSize: 12, color: colors.darkGray,
            align: 'center'
        });

        console.log('✅ 슬라이드 1: 표지 생성 완료');
    }

    // ----------------------------------------
    // 슬라이드 2: Document History
    // ----------------------------------------
    createHistorySlide() {
        const slide = this.pptx.addSlide();
        slide.background = { color: colors.white };

        // 헤더
        slide.addShape('rect', {
            x: 0, y: 0, w: 10, h: 0.7,
            fill: { color: colors.secondary }
        });
        slide.addText('Document History', {
            x: 0.5, y: 0.15, w: 5, h: 0.4,
            fontSize: 20, bold: true, color: colors.white
        });

        // 히스토리 테이블
        const historyData = [
            ['날짜', '버전', '주요 내용', '상세 내용', '비고'],
            [this.config.date || '', 'D1.0', '초안 작성', `${this.config.projectName || '프로젝트'} 기획서 초안 작성`, ''],
            ['', '', '', '', ''],
            ['', '', '', '', '']
        ];

        slide.addTable(historyData, {
            x: 0.5, y: 1.2, w: 9, h: 2.5,
            fontSize: 10,
            color: colors.secondary,
            border: { pt: 0.5, color: colors.darkGray },
            colW: [1.2, 0.8, 1.5, 4, 1.5],
            align: 'center',
            valign: 'middle'
        });

        console.log('✅ 슬라이드 2: Document History 생성 완료');
    }

    // ----------------------------------------
    // 슬라이드 3: 목차
    // ----------------------------------------
    createTOCSlide() {
        const slide = this.pptx.addSlide();
        slide.background = { color: colors.white };

        // 헤더
        slide.addShape('rect', {
            x: 0, y: 0, w: 10, h: 0.7,
            fill: { color: colors.secondary }
        });
        slide.addText('목차 (Table of Contents)', {
            x: 0.5, y: 0.15, w: 5, h: 0.4,
            fontSize: 20, bold: true, color: colors.white
        });

        const tocItems = this.config.tocItems || [
            { num: '01', title: '프로젝트 개요', desc: '시스템 목적 및 범위' },
            { num: '02', title: '메뉴 구조 (IA)', desc: 'Information Architecture' },
            { num: '03', title: '화면 설계', desc: '상세 스토리보드' }
        ];

        tocItems.forEach((item, idx) => {
            const y = 1.1 + idx * 0.7;

            // 번호 박스
            slide.addShape('rect', {
                x: 0.8, y: y, w: 0.6, h: 0.5,
                fill: { color: colors.primary }
            });
            slide.addText(item.num, {
                x: 0.8, y: y, w: 0.6, h: 0.5,
                fontSize: 14, bold: true, color: colors.white,
                align: 'center', valign: 'middle'
            });

            // 제목
            slide.addText(item.title, {
                x: 1.6, y: y, w: 3, h: 0.5,
                fontSize: 14, bold: true, color: colors.secondary,
                valign: 'middle'
            });

            // 설명
            slide.addText(item.desc, {
                x: 4.8, y: y, w: 4, h: 0.5,
                fontSize: 11, color: colors.darkGray,
                valign: 'middle'
            });
        });

        console.log('✅ 슬라이드 3: 목차 생성 완료');
    }

    // ----------------------------------------
    // 슬라이드 4: 프로젝트 개요
    // ----------------------------------------
    createOverviewSlide() {
        const slide = this.pptx.addSlide();
        slide.background = { color: colors.white };

        // 헤더
        slide.addShape('rect', {
            x: 0, y: 0, w: 10, h: 0.7,
            fill: { color: colors.secondary }
        });
        slide.addText('01. 프로젝트 개요', {
            x: 0.5, y: 0.15, w: 5, h: 0.4,
            fontSize: 20, bold: true, color: colors.white
        });

        // 목적
        slide.addText('프로젝트 목적', {
            x: 0.5, y: 1, w: 4, h: 0.4,
            fontSize: 14, bold: true, color: colors.secondary
        });

        slide.addShape('rect', {
            x: 0.5, y: 1.4, w: 4.3, h: 1.8,
            fill: { color: colors.lightGray }
        });

        slide.addText(this.config.purpose || '업무 프로세스를 시스템화하여\n효율성 향상 및 자동화 구현', {
            x: 0.7, y: 1.5, w: 4, h: 1.6,
            fontSize: 11, valign: 'top'
        });

        // 주요 기능
        slide.addText('주요 기능', {
            x: 5.2, y: 1, w: 4, h: 0.4,
            fontSize: 14, bold: true, color: colors.secondary
        });

        const features = this.config.features || [
            '데이터 입력 및 관리',
            '자동 계산 및 처리',
            '보고서 생성',
            '이력 관리'
        ];

        features.slice(0, 5).forEach((feat, idx) => {
            slide.addText('✓ ' + feat, {
                x: 5.2, y: 1.4 + idx * 0.35, w: 4.3, h: 0.35,
                fontSize: 10, color: colors.secondary
            });
        });

        // 기대 효과
        slide.addText('기대 효과', {
            x: 0.5, y: 3.5, w: 9, h: 0.4,
            fontSize: 14, bold: true, color: colors.secondary
        });

        const effects = this.config.effects || [
            { icon: '⏱️', title: '시간 단축', desc: '업무 처리 시간 감소' },
            { icon: '✅', title: '정확성 향상', desc: '오류 최소화' },
            { icon: '📊', title: '표준화', desc: '프로세스 통일' }
        ];

        effects.forEach((eff, idx) => {
            const x = 0.5 + idx * 3.1;
            slide.addShape('rect', {
                x: x, y: 3.9, w: 2.9, h: 1.4,
                fill: { color: colors.lightGray },
                line: { color: colors.primary, width: 1 }
            });
            slide.addText(eff.icon, {
                x: x, y: 4, w: 2.9, h: 0.5,
                fontSize: 24, align: 'center'
            });
            slide.addText(eff.title, {
                x: x, y: 4.5, w: 2.9, h: 0.35,
                fontSize: 11, bold: true, color: colors.secondary,
                align: 'center'
            });
            slide.addText(eff.desc, {
                x: x, y: 4.85, w: 2.9, h: 0.35,
                fontSize: 9, color: colors.darkGray,
                align: 'center'
            });
        });

        console.log('✅ 슬라이드 4: 프로젝트 개요 생성 완료');
    }

    // ----------------------------------------
    // 슬라이드 5: 메뉴 구조 (IA)
    // ----------------------------------------
    createIASlide() {
        const slide = this.pptx.addSlide();
        slide.background = { color: colors.white };

        // 헤더
        slide.addShape('rect', {
            x: 0, y: 0, w: 10, h: 0.7,
            fill: { color: colors.secondary }
        });
        slide.addText('02. 메뉴 구조 (Information Architecture)', {
            x: 0.5, y: 0.15, w: 6, h: 0.4,
            fontSize: 20, bold: true, color: colors.white
        });

        // 루트 노드
        const rootName = this.config.projectName ?
            this.config.projectName.replace(/시스템|프로젝트|기획/g, '').trim() :
            '시스템';

        slide.addShape('rect', {
            x: 4, y: 1, w: 2, h: 0.6,
            fill: { color: colors.secondary }
        });
        slide.addText(rootName, {
            x: 4, y: 1, w: 2, h: 0.6,
            fontSize: 12, bold: true, color: colors.white,
            align: 'center', valign: 'middle'
        });

        // 연결선
        slide.addShape('line', {
            x: 5, y: 1.6, w: 0, h: 0.4,
            line: { color: colors.darkGray, width: 1 }
        });
        slide.addShape('line', {
            x: 1.5, y: 2, w: 7, h: 0,
            line: { color: colors.darkGray, width: 1 }
        });

        // 1차 메뉴
        const level1 = this.config.mainMenus || [
            { title: '메뉴 1', children: ['하위 1-1', '하위 1-2'] },
            { title: '메뉴 2', children: ['하위 2-1', '하위 2-2'] },
            { title: '메뉴 3', children: ['하위 3-1', '하위 3-2'] },
            { title: '메뉴 4', children: ['하위 4-1', '하위 4-2'] }
        ];

        const menuCount = Math.min(level1.length, 4);
        const menuWidth = 2.2;
        const totalWidth = menuCount * menuWidth + (menuCount - 1) * 0.1;
        const startX = (10 - totalWidth) / 2;

        level1.slice(0, 4).forEach((menu, idx) => {
            const x = startX + idx * (menuWidth + 0.1);

            // 세로 연결선
            slide.addShape('line', {
                x: x + menuWidth / 2, y: 2, w: 0, h: 0.3,
                line: { color: colors.darkGray, width: 1 }
            });

            // 1차 메뉴 박스
            slide.addShape('rect', {
                x: x, y: 2.3, w: menuWidth, h: 0.5,
                fill: { color: colors.primary }
            });
            slide.addText(menu.title, {
                x: x, y: 2.3, w: menuWidth, h: 0.5,
                fontSize: 11, bold: true, color: colors.white,
                align: 'center', valign: 'middle'
            });

            // 2차 메뉴
            (menu.children || []).slice(0, 3).forEach((child, cIdx) => {
                const y = 3 + cIdx * 0.45;
                slide.addShape('rect', {
                    x: x, y: y, w: menuWidth, h: 0.4,
                    fill: { color: colors.lightGray },
                    line: { color: colors.wireframeBorder, width: 0.5 }
                });
                slide.addText(child, {
                    x: x, y: y, w: menuWidth, h: 0.4,
                    fontSize: 9, color: colors.secondary,
                    align: 'center', valign: 'middle'
                });
            });
        });

        console.log('✅ 슬라이드 5: 메뉴 구조 (IA) 생성 완료');
    }

    // ----------------------------------------
    // 스토리보드 슬라이드 (화면 설계)
    // ----------------------------------------
    createStoryboardSlide(screenInfo, pageNum) {
        const slide = this.pptx.addSlide();
        slide.background = { color: colors.white };

        // 헤더 정보 테이블
        const headerData = [
            ['Task Name', screenInfo.taskName || '', 'Ver.', 'D1.0', 'Page', String(pageNum)],
            ['Route', screenInfo.route || '', 'Screen Name', screenInfo.screenName || '', 'Screen ID', screenInfo.screenId || '']
        ];

        slide.addTable(headerData, {
            x: 0.2, y: 0.1, w: 9.6, h: 0.5,
            fontSize: 8,
            color: colors.secondary,
            border: { pt: 0.5, color: colors.darkGray },
            fill: { color: colors.lightGray },
            colW: [0.8, 2.5, 0.8, 2.5, 0.8, 2.2]
        });

        // 와이어프레임 영역 (좌측)
        slide.addShape('rect', {
            x: 0.2, y: 0.7, w: 6.8, h: 4.75,
            fill: { color: colors.wireframeBg },
            line: { color: colors.wireframeBorder, width: 1 }
        });

        // 와이어프레임 헤더
        slide.addShape('rect', {
            x: 0.3, y: 0.8, w: 6.6, h: 0.4,
            fill: { color: colors.secondary }
        });
        slide.addText(this.config.projectName || '시스템', {
            x: 0.4, y: 0.8, w: 2, h: 0.4,
            fontSize: 10, bold: true, color: colors.white,
            valign: 'middle'
        });

        // 와이어프레임 내용
        if (screenInfo.wireframeElements) {
            screenInfo.wireframeElements.forEach(el => {
                if (el.type === 'rect') {
                    slide.addShape('rect', {
                        x: el.x, y: el.y, w: el.w, h: el.h,
                        fill: { color: el.fill || colors.white },
                        line: { color: colors.wireframeBorder, width: 0.5 }
                    });
                }
                if (el.text) {
                    slide.addText(el.text, {
                        x: el.x, y: el.y, w: el.w, h: el.h,
                        fontSize: el.fontSize || 8,
                        color: el.color || colors.secondary,
                        align: el.align || 'center',
                        valign: 'middle',
                        bold: el.bold || false
                    });
                }
            });
        } else {
            // 기본 와이어프레임 구조
            // 사이드바
            slide.addShape('rect', {
                x: 0.3, y: 1.3, w: 1.2, h: 4,
                fill: { color: colors.lightGray }
            });
            slide.addText('메뉴', {
                x: 0.3, y: 1.4, w: 1.2, h: 0.3,
                fontSize: 8, color: colors.secondary, align: 'center'
            });

            // 메인 콘텐츠 영역
            slide.addShape('rect', {
                x: 1.6, y: 1.3, w: 5.3, h: 0.4,
                fill: { color: colors.white }
            });
            slide.addText(screenInfo.screenName || '화면 제목', {
                x: 1.6, y: 1.3, w: 5.3, h: 0.4,
                fontSize: 12, bold: true, color: colors.secondary, align: 'left'
            });

            // 콘텐츠 영역 플레이스홀더
            slide.addShape('rect', {
                x: 1.6, y: 1.8, w: 5.3, h: 3.4,
                fill: { color: colors.white },
                line: { color: colors.wireframeBorder, width: 0.5, dashType: 'dash' }
            });
            slide.addText('콘텐츠 영역', {
                x: 1.6, y: 3.2, w: 5.3, h: 0.4,
                fontSize: 10, color: colors.darkGray, align: 'center'
            });
        }

        // Description 영역 (우측)
        slide.addShape('rect', {
            x: 7.1, y: 0.7, w: 2.7, h: 4.75,
            fill: { color: colors.black }
        });

        // Description 헤더
        slide.addShape('rect', {
            x: 7.2, y: 0.8, w: 2.5, h: 0.35,
            fill: { color: colors.accent }
        });
        slide.addText('Description', {
            x: 7.2, y: 0.8, w: 2.5, h: 0.35,
            fontSize: 9, bold: true, color: colors.white,
            align: 'center', valign: 'middle'
        });

        // Description 항목
        const descriptions = screenInfo.descriptions || [
            { title: '기능 1', content: '기능 설명 1' },
            { title: '기능 2', content: '기능 설명 2' },
            { title: '기능 3', content: '기능 설명 3' }
        ];

        descriptions.slice(0, 5).forEach((desc, idx) => {
            const y = 1.25 + idx * 0.85;

            // 번호 원
            slide.addShape('ellipse', {
                x: 7.25, y: y, w: 0.25, h: 0.25,
                fill: { color: colors.accent }
            });
            slide.addText(String(idx + 1), {
                x: 7.25, y: y, w: 0.25, h: 0.25,
                fontSize: 7, bold: true, color: colors.white,
                align: 'center', valign: 'middle'
            });

            // 제목
            slide.addText(desc.title, {
                x: 7.55, y: y, w: 2.1, h: 0.25,
                fontSize: 8, bold: true, color: colors.white
            });

            // 설명
            slide.addText(desc.content, {
                x: 7.25, y: y + 0.28, w: 2.4, h: 0.5,
                fontSize: 7, color: colors.darkGray
            });
        });

        console.log(`✅ 슬라이드 ${pageNum}: ${screenInfo.screenName || '화면'} 생성 완료`);
    }

    // ----------------------------------------
    // 전체 생성
    // ----------------------------------------
    async generate() {
        console.log('🚀 스토리보드 PPTX 생성 시작\n');

        try {
            // 기본 슬라이드
            this.createCoverSlide();
            this.createHistorySlide();
            this.createTOCSlide();
            this.createOverviewSlide();
            this.createIASlide();

            // 스토리보드 슬라이드
            const screens = this.config.screens || [];
            screens.forEach((screen, idx) => {
                this.createStoryboardSlide(screen, idx + 6);
            });

            // 파일 저장
            const outputPath = this.config.outputPath || 'storyboard.pptx';
            const outputDir = path.dirname(outputPath);

            if (!fs.existsSync(outputDir)) {
                fs.mkdirSync(outputDir, { recursive: true });
            }

            await this.pptx.writeFile({ fileName: outputPath });

            // 결과 출력
            const stats = fs.statSync(outputPath);
            console.log('\n🎉 스토리보드 PPTX 생성 완료!');
            console.log(`📁 저장 위치: ${outputPath}`);
            console.log(`📏 파일 크기: ${(stats.size / 1024).toFixed(1)} KB`);
            console.log(`📊 총 슬라이드: ${5 + screens.length}장`);

            return outputPath;
        } catch (error) {
            console.error('❌ 생성 실패:', error.message);
            throw error;
        }
    }
}

// ========================================
// CLI 실행
// ========================================
async function main() {
    const args = process.argv.slice(2);

    // 인자 파싱
    let inputFile = null;
    let outputFile = null;
    let configFile = null;

    for (let i = 0; i < args.length; i++) {
        if (args[i] === '--input' && args[i + 1]) {
            inputFile = args[i + 1];
            i++;
        } else if (args[i] === '--output' && args[i + 1]) {
            outputFile = args[i + 1];
            i++;
        } else if (args[i] === '--config' && args[i + 1]) {
            configFile = args[i + 1];
            i++;
        }
    }

    let config = {};

    // 설정 파일이 있으면 로드
    if (configFile && fs.existsSync(configFile)) {
        config = JSON.parse(fs.readFileSync(configFile, 'utf-8'));
        console.log(`📄 설정 파일 로드: ${configFile}`);
    }

    // 입력 파일 분석
    if (inputFile && fs.existsSync(inputFile)) {
        console.log(`📄 입력 파일 분석: ${inputFile}`);
        const content = fs.readFileSync(inputFile, 'utf-8');
        const parser = new TextParser(content).parse();

        // 파싱 결과를 config에 병합
        if (parser.metadata.projectName) {
            config.projectName = config.projectName || parser.metadata.projectName;
        }
        if (parser.metadata.date) {
            config.date = config.date || parser.metadata.date;
        }
        if (parser.metadata.author) {
            config.author = config.author || parser.metadata.author;
        }
    }

    // 출력 파일 설정
    if (outputFile) {
        config.outputPath = outputFile;
    } else if (!config.outputPath) {
        config.outputPath = 'storyboard.pptx';
    }

    // 생성
    const generator = new StoryboardGenerator(config);
    await generator.generate();
}

// 모듈 내보내기
module.exports = { TextParser, StoryboardGenerator, colors };

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