/**
 * Enhanced PPTX Generator - 재사용 가능한 프레젠테이션 생성 모듈
 * 카드형 배경, 아이콘, 통계 카드 등 시각적 요소를 포함한 PowerPoint 생성
 */

const pptxgen = require('pptxgenjs');

class EnhancedPPTXGenerator {
  constructor(options = {}) {
    this.pres = new pptxgen();
    this.pres.layout = options.layout || 'LAYOUT_16x9';
    this.pres.author = options.author || 'Enhanced PPTX Generator';
    this.pres.title = options.title || 'Generated Presentation';

    // 기본 브랜드 색상 설정
    this.brandColor = options.brandColor || 'FF0000';
    this.backgroundColor = options.backgroundColor || 'ffffff';
    this.cardColor = options.cardColor || 'f8f9fa';
    this.borderColor = options.borderColor || 'e2e8f0';
  }

  /**
   * 카드형 배경 도형 추가
   */
  addCard(slide, x, y, width, height, options = {}) {
    const cardOptions = {
      x, y, w: width, h: height,
      fill: { color: options.fillColor || this.cardColor },
      line: {
        color: options.borderColor || this.borderColor,
        width: options.borderWidth || 1
      },
      rectRadius: options.radius || 0.15
    };

    slide.addShape(this.pres.ShapeType.rect, cardOptions);

    // 상단 컬러 바 추가 (옵션)
    if (options.topBar) {
      slide.addShape(this.pres.ShapeType.rect, {
        x, y, w: width, h: options.topBarHeight || 0.15,
        fill: { color: options.topBarColor || this.brandColor }
      });
    }

    return cardOptions;
  }

  /**
   * 원형 아이콘 배경 추가
   */
  addIconBackground(slide, x, y, size, iconText, options = {}) {
    // 원형 배경
    slide.addShape(this.pres.ShapeType.ellipse, {
      x, y, w: size, h: size,
      fill: { color: options.backgroundColor || this.brandColor },
      line: { color: options.borderColor || this.brandColor, width: options.borderWidth || 0 }
    });

    // 아이콘 텍스트
    slide.addText(iconText, {
      x, y, w: size, h: size,
      fontSize: options.fontSize || (size * 40), // 크기에 비례한 폰트
      color: options.textColor || 'ffffff',
      align: 'center',
      valign: 'middle'
    });

    return { x, y, size };
  }

  /**
   * 통계 카드 추가
   */
  addStatCard(slide, x, y, width, height, statData, options = {}) {
    const { number, description, icon, color } = statData;

    // 카드 배경
    slide.addShape(this.pres.ShapeType.rect, {
      x, y, w: width, h: height,
      fill: { color: options.backgroundColor || 'ffffff' },
      line: { color: color || this.brandColor, width: options.borderWidth || 2 },
      rectRadius: options.radius || 0.15
    });

    // 아이콘 (선택사항)
    if (icon) {
      slide.addText(icon, {
        x: x + 0.1, y: y + 0.1, w: 0.5, h: 0.5,
        fontSize: options.iconSize || 24
      });
    }

    // 숫자/통계
    slide.addText(number, {
      x: x + (icon ? 0.7 : 0.1),
      y: y + 0.15,
      w: width - (icon ? 0.8 : 0.2),
      h: height * 0.4,
      fontSize: options.numberSize || 18,
      bold: true,
      color: color || this.brandColor,
      align: 'center'
    });

    // 설명
    slide.addText(description, {
      x: x + 0.1,
      y: y + height * 0.6,
      w: width - 0.2,
      h: height * 0.3,
      fontSize: options.descriptionSize || 11,
      color: '666666',
      align: 'center'
    });

    return { x, y, width, height };
  }

  /**
   * 타임라인 단계 추가
   */
  addTimelineStep(slide, x, y, stepNumber, title, description, options = {}) {
    const stepColor = options.completed ? this.brandColor : 'f0f0f0';
    const textColor = options.completed ? 'ffffff' : '666666';

    // 원형 단계 번호
    this.addIconBackground(slide, x, y, 0.6, stepNumber.toString(), {
      backgroundColor: stepColor,
      textColor: textColor,
      fontSize: 20
    });

    // 제목
    slide.addText(title, {
      x: x + 0.8, y: y, w: 7, h: 0.4,
      fontSize: 16, bold: true, color: this.brandColor
    });

    // 설명
    slide.addText(description, {
      x: x + 0.8, y: y + 0.4, w: 7, h: 0.4,
      fontSize: 12, color: '666666'
    });

    return { x, y };
  }

  /**
   * 제목 슬라이드 생성
   */
  createTitleSlide(mainTitle, subtitle, description, options = {}) {
    const slide = this.pres.addSlide();
    slide.background = { color: this.backgroundColor };

    // 메인 카드
    this.addCard(slide, 1.5, 1, 7, 4, {
      topBar: true,
      topBarColor: this.brandColor
    });

    // 메인 제목
    slide.addText(mainTitle, {
      x: 1.5, y: 1.8, w: 7, h: 1,
      fontSize: options.titleSize || 48,
      bold: true,
      color: '282828',
      align: 'center'
    });

    // 부제목
    if (subtitle) {
      slide.addText(subtitle, {
        x: 1.5, y: 2.8, w: 7, h: 0.8,
        fontSize: options.subtitleSize || 24,
        bold: true,
        color: this.brandColor,
        align: 'center'
      });
    }

    // 설명
    if (description) {
      slide.addText(description, {
        x: 1.5, y: 3.6, w: 7, h: 0.6,
        fontSize: options.descriptionSize || 16,
        color: '666666',
        align: 'center'
      });
    }

    return slide;
  }

  /**
   * 콘텐츠 슬라이드 생성
   */
  createContentSlide(title, items = [], options = {}) {
    const slide = this.pres.addSlide();
    slide.background = { color: this.backgroundColor };

    // 제목
    slide.addText(title, {
      x: 0.5, y: 0.5, w: 9, h: 0.8,
      fontSize: options.titleSize || 28,
      bold: true,
      color: '282828'
    });

    // 아이템들을 카드 형태로 배치
    items.forEach((item, index) => {
      const cols = options.columns || 2;
      const x = 0.5 + (index % cols) * (9 / cols);
      const y = 1.5 + Math.floor(index / cols) * (options.itemHeight || 1.5);
      const width = (9 / cols) - 0.3;
      const height = options.itemHeight || 1.3;

      this.addCard(slide, x, y, width, height, {
        topBar: true
      });

      // 아이콘
      if (item.icon) {
        this.addIconBackground(slide, x + 0.2, y + 0.2, 0.6, item.icon, {
          backgroundColor: this.brandColor
        });
      }

      // 제목
      slide.addText(item.title, {
        x: x + (item.icon ? 1 : 0.3),
        y: y + 0.3,
        w: width - (item.icon ? 1.3 : 0.6),
        h: 0.4,
        fontSize: 16, bold: true, color: this.brandColor
      });

      // 설명
      if (item.description) {
        slide.addText(item.description, {
          x: x + 0.3,
          y: y + 0.8,
          w: width - 0.6,
          h: 0.4,
          fontSize: 11, color: '666666'
        });
      }
    });

    return slide;
  }

  /**
   * 통계 슬라이드 생성
   */
  createStatsSlide(title, stats = [], options = {}) {
    const slide = this.pres.addSlide();
    slide.background = { color: this.backgroundColor };

    // 제목
    slide.addText(title, {
      x: 0.5, y: 0.5, w: 9, h: 0.8,
      fontSize: options.titleSize || 28,
      bold: true,
      color: '282828'
    });

    // 통계 카드들
    stats.forEach((stat, index) => {
      const x = 0.25 + index * (9 / stats.length);
      const width = (9 / stats.length) - 0.3;

      this.addStatCard(slide, x, 2, width, 1.5, stat);
    });

    return slide;
  }

  /**
   * 파일 저장
   */
  async save(filename) {
    const fs = require('fs');
    const path = require('path');

    // pptx 폴더 경로 생성
    const pptxDir = 'pptx';
    if (!fs.existsSync(pptxDir)) {
      fs.mkdirSync(pptxDir, { recursive: true });
    }

    // 파일 경로 설정
    const fullPath = path.join(pptxDir, filename);

    await this.pres.writeFile({ fileName: fullPath });
    return {
      filename: fullPath,
      slideCount: this.pres.slides.length,
      success: true
    };
  }

  /**
   * 슬라이드 수 반환
   */
  getSlideCount() {
    return this.pres.slides.length;
  }
}

// 편의 함수들
const createJoCodingPresentation = async (options = {}) => {
  const generator = new EnhancedPPTXGenerator({
    title: '조코딩(조웅현) - 국내 1위 코딩 교육 유튜버',
    author: '조코딩',
    brandColor: 'FF0000',
    ...options
  });

  // 슬라이드 1: 표지
  generator.createTitleSlide(
    '조코딩',
    'JoCoding',
    '국내 1위 코딩 교육 유튜버'
  );

  // 슬라이드 2: 프로필
  const profileItems = [
    {
      icon: '👤',
      title: '기본 정보',
      description: '• 실명: 조웅현\n• 전공: 고려대 환경생태공학부\n• 경력: 비전공자 → 개발자 → 교육자'
    },
    {
      icon: '🚀',
      title: '현재 활동',
      description: '• 유튜브: 68만 구독자\n• 회사: ㈜코드마피아 대표\n• 서비스: 조카소 AI 개발/운영'
    }
  ];

  generator.createContentSlide('프로필 개요', profileItems);

  // 슬라이드 3: 통계
  const stats = [
    { number: '68만+', description: '유튜브 구독자', icon: '📺', color: 'FF0000' },
    { number: '2019', description: '시작 연도', icon: '🗓️', color: '666666' },
    { number: '2,000만+', description: '동물상 테스트', icon: '🤖', color: 'ff6600' },
    { number: '1,000+', description: '교육생', icon: '🎓', color: '00aa00' }
  ];

  generator.createStatsSlide('주요 성과', stats);

  return await generator.save(options.filename || '조코딩_프레젠테이션_모듈생성.pptx');
};

module.exports = {
  EnhancedPPTXGenerator,
  createJoCodingPresentation
};