/**
 * PDF 템플릿 분석기 - PDF 구조를 분석하여 템플릿 생성
 */

const fs = require('fs').promises;
const path = require('path');

// PDF 템플릿 분석 클래스
class PDFTemplateAnalyzer {
  constructor() {
    this.template = {
      metadata: {},
      slides: [],
      styles: {
        colors: {},
        fonts: {}
      },
      variables: {}
    };
  }

  /**
   * SAM ERP 견적서 PDF 분석 (수동 매핑)
   */
  async analyzeSAMEstimate(inputPath) {
    console.log(`📖 SAM ERP 견적서 PDF 분석: ${inputPath}`);

    // 메타데이터 설정
    this.template.metadata = {
      source: path.basename(inputPath),
      pages: 5,
      extractedAt: new Date().toISOString().split('T')[0],
      title: "SAM ERP 견적서",
      type: "estimate"
    };

    // 스타일 정의
    this.template.styles = {
      colors: {
        primary: '0066CC',      // SAM 파란색
        secondary: '333333',    // 진한 회색
        headerBg: 'F0F8FF',     // 연한 파란색
        border: 'CCCCCC',       // 테두리 회색
        white: 'FFFFFF',
        black: '000000',
        red: 'CC0000',
        green: '008000'
      },
      fonts: {
        title: { face: 'Arial', size: 32, bold: true },
        heading: { face: 'Arial', size: 24, bold: true },
        subheading: { face: 'Arial', size: 18, bold: true },
        body: { face: 'Arial', size: 12 },
        small: { face: 'Arial', size: 10 }
      }
    };

    // 슬라이드 템플릿 생성
    this.createCoverSlideTemplate();
    this.createMainScreenTemplate();
    this.createDetailScreenTemplate();
    this.createEstimateDocTemplate();
    this.createEstimateDetailTemplate();

    // 변수 정의
    this.template.variables = {
      // 회사 정보
      company: { type: 'string', default: '(주) 주일기업' },
      documentNumber: { type: 'string', default: 'ABC123' },
      date: { type: 'date', default: '2025-01-03' },

      // 고객 정보
      clientName: { type: 'string', default: '회사명' },
      siteName: { type: 'string', default: '현장명' },
      clientAddress: { type: 'string', default: '주소명' },
      clientContact: { type: 'string', default: '연락처' },
      clientPhone: { type: 'string', default: '010-1234-5678' },

      // 견적 정보
      estimateNumber: { type: 'string', default: '123123' },
      estimator: { type: 'string', default: '이름' },
      totalAmount: { type: 'number', default: 93950000 },
      bidDate: { type: 'date', default: '2025-12-12' },

      // 상품 목록
      items: {
        type: 'array',
        default: [
          {
            no: 1,
            name: 'FSSB01(주차장)',
            product: '제품명',
            width: 2530,
            height: 2550,
            quantity: 1,
            unit: 'SET',
            materialCost: 1420000,
            laborCost: 510000,
            totalCost: 1930000
          }
        ]
      },

      // 요약 정보
      summary: {
        type: 'object',
        default: {
          description: '셔터설치공사',
          quantity: 1,
          unit: '식',
          materialTotal: 78540000,
          laborTotal: 15410000,
          grandTotal: 93950000
        }
      },

      // 기타 정보
      notes: { type: 'string', default: '부가세 별도 / 현설조건에 따름' }
    };

    console.log('✅ SAM ERP 견적서 템플릿 분석 완료');
    return this.template;
  }

  /**
   * 표지 슬라이드 템플릿
   */
  createCoverSlideTemplate() {
    this.template.slides.push({
      slideNumber: 1,
      type: 'cover',
      name: '표지',
      layout: { width: 10, height: 7.5 },
      elements: [
        {
          type: 'background',
          id: 'coverBackground',
          style: { color: '{{colors.primary}}' }
        },
        {
          type: 'shape',
          id: 'logoArea',
          shapeType: 'rect',
          position: { x: 1, y: 1, w: 2, h: 1 },
          style: {
            fill: { color: '{{colors.white}}' },
            line: { color: '{{colors.border}}', width: 1 }
          }
        },
        {
          type: 'text',
          id: 'logoText',
          position: { x: 1, y: 1, w: 2, h: 0.5 },
          content: 'SAM',
          style: {
            fontSize: 24,
            bold: true,
            color: '{{colors.primary}}',
            align: 'center'
          }
        },
        {
          type: 'text',
          id: 'logoSubtext',
          position: { x: 1, y: 1.5, w: 2, h: 0.5 },
          content: 'Smart Automation Management',
          style: {
            fontSize: 10,
            color: '{{colors.secondary}}',
            align: 'center'
          }
        },
        {
          type: 'text',
          id: 'mainTitle',
          position: { x: 2, y: 3, w: 6, h: 1.5 },
          content: '{{title}}',
          placeholder: '{{title}}',
          style: {
            fontSize: 48,
            bold: true,
            color: '{{colors.white}}',
            align: 'center'
          }
        },
        {
          type: 'text',
          id: 'subtitle',
          position: { x: 2, y: 4.8, w: 6, h: 0.8 },
          content: 'SAM ERP 견적관리 시스템',
          style: {
            fontSize: 24,
            color: '{{colors.white}}',
            align: 'center'
          }
        },
        {
          type: 'text',
          id: 'dateAndCompany',
          position: { x: 7.5, y: 7, w: 2.5, h: 1.5 },
          content: '{{date}}\\n\\n{{company}}',
          placeholder: '{{date}}\\n\\n{{company}}',
          style: {
            fontSize: 12,
            color: '{{colors.white}}',
            align: 'right'
          }
        }
      ]
    });
  }

  /**
   * 견적관리 메인 화면 템플릿
   */
  createMainScreenTemplate() {
    this.template.slides.push({
      slideNumber: 2,
      type: 'main_screen',
      name: '견적관리 메인',
      layout: { width: 10, height: 7.5 },
      elements: [
        {
          type: 'text',
          id: 'pageTitle',
          position: { x: 0.5, y: 0.3, w: 6, h: 0.6 },
          content: '견적관리',
          style: {
            fontSize: 24,
            bold: true,
            color: '{{colors.secondary}}'
          }
        },
        {
          type: 'text',
          id: 'pageDescription',
          position: { x: 0.5, y: 0.9, w: 6, h: 0.4 },
          content: '견적을 관리합니다',
          style: {
            fontSize: 14,
            color: '{{colors.secondary}}'
          }
        },
        {
          type: 'shape',
          id: 'filterArea',
          shapeType: 'rect',
          position: { x: 0.5, y: 1.5, w: 9, h: 1 },
          style: {
            fill: { color: '{{colors.headerBg}}' },
            line: { color: '{{colors.border}}', width: 1 }
          }
        },
        {
          type: 'dynamicStats',
          id: 'statsBoxes',
          position: { x: 2, y: 2.8, w: 6, h: 1.2 },
          dataSource: 'stats',
          template: {
            type: 'statBox',
            width: 1.8,
            spacing: 0.1
          }
        },
        {
          type: 'table',
          id: 'estimateList',
          position: { x: 0.5, y: 4.5, w: 9, h: 2.5 },
          dataSource: 'estimates',
          headers: ['견적번호', '거래처', '현장명', '견적자', '총 개소', '견적금액', '견적완료일', '입찰일', '상태', '작업'],
          style: {
            border: { pt: 1, color: '{{colors.border}}' },
            fontSize: 10,
            headerBg: '{{colors.headerBg}}'
          }
        }
      ]
    });
  }

  /**
   * 견적 상세 화면 템플릿
   */
  createDetailScreenTemplate() {
    this.template.slides.push({
      slideNumber: 3,
      type: 'detail_screen',
      name: '견적 상세',
      layout: { width: 10, height: 7.5 },
      elements: [
        {
          type: 'text',
          id: 'pageTitle',
          position: { x: 0.5, y: 0.3, w: 6, h: 0.6 },
          content: '견적 상세',
          style: {
            fontSize: 24,
            bold: true,
            color: '{{colors.secondary}}'
          }
        },
        {
          type: 'buttonGroup',
          id: 'actionButtons',
          position: { x: 4, y: 0.3, w: 4.5, h: 0.6 },
          buttons: [
            { text: '견적서 보기', action: 'viewEstimate' },
            { text: '전자결재', action: 'approval' },
            { text: '수정', action: 'edit' }
          ]
        },
        {
          type: 'infoSection',
          id: 'estimateInfo',
          position: { x: 0.5, y: 1.2, w: 9, h: 1.8 },
          title: '견적 정보',
          fields: [
            { label: '견적번호', field: 'estimateNumber' },
            { label: '견적자', field: 'estimator' },
            { label: '견적금액', field: 'totalAmount', format: 'currency' },
            { label: '상태', field: 'status' }
          ]
        },
        {
          type: 'infoSection',
          id: 'siteInfo',
          position: { x: 0.5, y: 3.2, w: 9, h: 1.8 },
          title: '현장설명회 정보',
          fields: [
            { label: '현설번호', field: 'siteNumber' },
            { label: '거래처명', field: 'clientName' },
            { label: '현장설명회 일자', field: 'siteDate' },
            { label: '참석자', field: 'attendee' }
          ]
        },
        {
          type: 'infoSection',
          id: 'bidInfo',
          position: { x: 0.5, y: 5.2, w: 9, h: 1.5 },
          title: '입찰 정보',
          fields: [
            { label: '현장명', field: 'siteName' },
            { label: '입찰일자', field: 'bidDate' },
            { label: '개소', field: 'quantity' },
            { label: '공사기간', field: 'constructionPeriod' }
          ]
        }
      ]
    });
  }

  /**
   * 견적서 문서 (요약) 템플릿
   */
  createEstimateDocTemplate() {
    this.template.slides.push({
      slideNumber: 4,
      type: 'estimate_document',
      name: '견적서 문서 (요약)',
      layout: { width: 10, height: 7.5 },
      elements: [
        {
          type: 'text',
          id: 'documentTitle',
          position: { x: 3, y: 0.5, w: 4, h: 0.8 },
          content: '견적서',
          style: {
            fontSize: 32,
            bold: true,
            color: '{{colors.secondary}}',
            align: 'center'
          }
        },
        {
          type: 'text',
          id: 'documentInfo',
          position: { x: 3, y: 1.3, w: 4, h: 0.4 },
          content: '문서번호: {{documentNumber}} | 작성일자: {{date}}',
          placeholder: '문서번호: {{documentNumber}} | 작성일자: {{date}}',
          style: {
            fontSize: 12,
            color: '{{colors.secondary}}',
            align: 'center'
          }
        },
        {
          type: 'table',
          id: 'companyInfoTable',
          position: { x: 1, y: 2, w: 8, h: 2 },
          dataSource: 'companyInfo',
          template: 'companyInfoLayout'
        },
        {
          type: 'text',
          id: 'estimateIntro',
          position: { x: 8, y: 3.7, w: 2, h: 0.4 },
          content: '하기와 같이 見積합니다.',
          style: {
            fontSize: 12,
            color: '{{colors.secondary}}',
            align: 'center'
          }
        },
        {
          type: 'table',
          id: 'summaryTable',
          position: { x: 1, y: 4.5, w: 8, h: 1.5 },
          dataSource: 'summary',
          headers: ['명칭', '수량', '단위', '재료비', '노무비', '합계', '비고'],
          template: 'summaryLayout'
        },
        {
          type: 'text',
          id: 'specialNotes',
          position: { x: 1, y: 6.2, w: 8, h: 0.4 },
          content: '* 특기사항: {{notes}}',
          placeholder: '* 특기사항: {{notes}}',
          style: {
            fontSize: 11,
            color: '{{colors.secondary}}'
          }
        }
      ]
    });
  }

  /**
   * 견적서 문서 (상세) 템플릿
   */
  createEstimateDetailTemplate() {
    this.template.slides.push({
      slideNumber: 5,
      type: 'estimate_detail',
      name: '견적서 문서 (상세)',
      layout: { width: 10, height: 7.5 },
      elements: [
        {
          type: 'text',
          id: 'detailTitle',
          position: { x: 3, y: 0.5, w: 4, h: 0.6 },
          content: '견적 상세 내역',
          style: {
            fontSize: 20,
            bold: true,
            color: '{{colors.secondary}}',
            align: 'center'
          }
        },
        {
          type: 'table',
          id: 'detailTable',
          position: { x: 0.2, y: 1.5, w: 9.6, h: 4 },
          dataSource: 'items',
          headers: [
            'NO', '명칭', '제품', '규격(mm)', '', '수량', '단위',
            '재료비', '', '노무비', '', '합계', '', '비고'
          ],
          subHeaders: [
            '', '', '', '가로(W)', '높이(H)', '', '',
            '단가', '금액', '단가', '금액', '단가', '금액', ''
          ],
          template: 'detailItemLayout',
          style: {
            border: { pt: 1, color: '{{colors.border}}' },
            fontSize: 8,
            headerBg: '{{colors.headerBg}}'
          }
        }
      ]
    });
  }

  /**
   * 템플릿을 JSON 파일로 저장
   */
  async saveTemplate(outputPath) {
    const dir = path.dirname(outputPath);
    await fs.mkdir(dir, { recursive: true });

    await fs.writeFile(
      outputPath,
      JSON.stringify(this.template, null, 2),
      'utf8'
    );

    console.log(`✅ 템플릿 저장 완료: ${outputPath}`);
    return outputPath;
  }

  /**
   * 범용 PDF 분석 (확장 가능)
   */
  async analyzeGenericPDF(inputPath) {
    // TODO: 실제 PDF 파싱 로직 구현
    console.log(`📖 범용 PDF 분석: ${inputPath}`);

    // 기본 템플릿 구조 생성
    this.template.metadata = {
      source: path.basename(inputPath),
      extractedAt: new Date().toISOString().split('T')[0],
      title: "Generic Template",
      type: "generic"
    };

    // 기본 스타일
    this.template.styles = {
      colors: {
        primary: '0066CC',
        secondary: '333333',
        background: 'FFFFFF'
      },
      fonts: {
        title: { face: 'Arial', size: 24, bold: true },
        body: { face: 'Arial', size: 12 }
      }
    };

    console.log('✅ 범용 PDF 분석 완료 (기본 템플릿)');
    return this.template;
  }
}

// 메인 실행 함수
async function analyzeTemplate(inputPath, outputPath, type = 'sam') {
  try {
    console.log('🚀 PDF 템플릿 분석 시작');
    console.log(`📄 입력: ${inputPath}`);
    console.log(`📊 출력: ${outputPath}`);

    const analyzer = new PDFTemplateAnalyzer();

    let template;
    if (type === 'sam') {
      template = await analyzer.analyzeSAMEstimate(inputPath);
    } else {
      template = await analyzer.analyzeGenericPDF(inputPath);
    }

    await analyzer.saveTemplate(outputPath);
    console.log('✅ 템플릿 분석 완료!');

    return outputPath;

  } 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 typeFlag = args.find(arg => arg.startsWith('--type='));

  const inputPath = inputFlag ? inputFlag.split('=')[1] : 'pdf_sample/SAM_견적관리.pdf';
  const outputPath = outputFlag ? outputFlag.split('=')[1] : 'templates/sam_estimate_template.json';
  const type = typeFlag ? typeFlag.split('=')[1] : 'sam';

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

  await analyzeTemplate(inputPath, outputPath, type);
}

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

module.exports = { analyzeTemplate, PDFTemplateAnalyzer };