import * as XLSX from "xlsx";
import { Injectable, Logger } from "@nestjs/common";


/**
 * Excel 파일 유틸리티
 * Lib활용 등 서비스에 가까운 공통 유틸이므로, 서비스 클래스 형태로 생성
 * 각 서비스 클래스에서 사용 가능하도록 공통 모듈로 생성
 */
@Injectable()
export class ExcelUtil {
    private readonly logger = new Logger(ExcelUtil.name);

    /**
     * file 파일 데이터를 파싱하여 json 배열로 변환 - 추후 공통으로 처리 가능하면 정리해서 처리
     * @param file - 파싱할 데이터
     * @returns json 배열
     */
    parseExcelData(file: Express.Multer.File): any[] {
        try {
          // ============================================
          // 1단계: 엑셀파일 로드
          // ============================================
          this.logger.log('[parseExcelData] 1단계: 엑셀 파일 로드 중...');
          
          let workbook: XLSX.WorkBook;

          if(file?.buffer) {
            workbook = XLSX.read(file.buffer, { type: 'buffer', cellDates: true });
          }else if (file?.path){
            workbook = XLSX.readFile(file.path, { cellDates: true });
          }else{
            throw new Error('file.buffer/file.path가 모두 없습니다.');
          }


          if (!workbook.SheetNames || workbook.SheetNames.length === 0) {
            throw new Error('엑셀 파일에 시트가 없습니다.');
          }
    
          const sheetName = workbook.SheetNames[0];
          const worksheet = workbook.Sheets[sheetName];
          
          if (!worksheet) {
            throw new Error(`시트 "${sheetName}"를 읽을 수 없습니다.`);
          }
    
          // 시트를 JSON 배열로 변환 (헤더 포함)
          const rawData = XLSX.utils.sheet_to_json(worksheet, { 
            header: 1, 
            defval: null,
            raw: false 
          }) as any[][];
    
          if (rawData.length < 2) {
            throw new Error('엑셀 파일에 데이터가 없습니다. (헤더 포함 최소 2행 필요)');
          }
    
          this.logger.log(`[parseExcelData] 엑셀 파일 로드 완료: ${rawData.length}행`);
    
          return rawData;
        } catch (error) {
          this.logger.error(`[parseExcelData] 처리 중 오류 발생: ${error.message}`);
          this.logger.error(error.stack);
          throw error;
        } finally {
          this.logger.log(`[parseExcelData] 처리 완료`);
        }
    }
}