// Facade API imports - 공식 문서 방식 (필요한 기능만 선택적 import)
import "@univerjs/sheets/facade";
import "@univerjs/sheets-ui/facade";

import { FUniver } from "@univerjs/core/facade";
import { coordsToAddress, rangeToAddress } from "./cellUtils";
import { useAppStore } from "../stores/useAppStore";

/**
 * 셀 선택 이벤트 핸들러 클래스
 * - Univer 셀 선택 이벤트를 감지하고 처리
 * - 선택된 셀 주소를 프롬프트 입력창에 자동 삽입
 * - SRP: 셀 선택과 관련된 로직만 담당
 */
export class CellSelectionHandler {
  private disposable: any = null;
  private univerAPI: any = null;

  /**
   * 셀 선택 이벤트 리스너 초기화
   * @param univer - Univer 인스턴스
   */
  public initialize(univer: any): void {
    try {
      // Univer CE 공식 방식으로 FUniver API 생성
      this.univerAPI = FUniver.newAPI(univer);

      // 셀 선택 변경 이벤트 구독 - 공식 문서 패턴 사용
      this.disposable = this.univerAPI.addEvent(
        this.univerAPI.Event.SelectionChanged,
        this.handleSelectionChange.bind(this),
      );

      console.log("📌 CellSelectionHandler: 셀 선택 이벤트 리스너 등록 완료");
    } catch (error) {
      console.error("❌ CellSelectionHandler 초기화 실패:", error);
    }
  }

  /**
   * 셀 선택 변경 이벤트 핸들러
   * @param params - 선택 변경 이벤트 파라미터
   */
  private handleSelectionChange(params: any): void {
    try {
      console.log("🎯 셀 선택 변경 감지 - 전체 파라미터:", params);
      console.log("🔍 파라미터 타입:", typeof params);
      console.log("🔍 파라미터 키들:", Object.keys(params || {}));

      // 다양한 경로로 선택 정보 탐색
      let selectionData = null;
      let cellAddress: string | null = null;
      let selectionType: "single" | "range" = "single";

      // 방법 1: params.selections 경로
      if (params && params.selections && params.selections.length > 0) {
        console.log("📍 방법 1: params.selections 경로에서 데이터 발견");
        selectionData = params.selections[0];
        console.log("📍 selections[0]:", selectionData);
        console.log("📍 selections[0] 키들:", Object.keys(selectionData || {}));
      }

      // 방법 2: params.selection 경로 (단수형)
      else if (params && params.selection) {
        console.log("📍 방법 2: params.selection 경로에서 데이터 발견");
        selectionData = params.selection;
        console.log("📍 selection:", selectionData);
        console.log("📍 selection 키들:", Object.keys(selectionData || {}));
      }

      // 방법 3: params 자체가 선택 데이터인 경우
      else if (
        params &&
        (params.startRow !== undefined || params.row !== undefined)
      ) {
        console.log("📍 방법 3: params 자체가 선택 데이터");
        selectionData = params;
        console.log("📍 직접 params:", selectionData);
      }

      // 선택 데이터에서 좌표 추출
      if (selectionData) {
        let startRow, startCol, endRow, endCol;

        // 패턴 A: range 객체 (기존 방식)
        if (selectionData.range) {
          console.log("🎯 패턴 A: range 객체 발견");
          const range = selectionData.range;
          startRow = range.startRow;
          startCol = range.startColumn || range.startCol;
          endRow = range.endRow;
          endCol = range.endColumn || range.endCol;
        }
        // 패턴 B: 직접 좌표 (startRow, startCol 등)
        else if (selectionData.startRow !== undefined) {
          console.log("🎯 패턴 B: 직접 좌표 발견 (startRow/startCol)");
          startRow = selectionData.startRow;
          startCol = selectionData.startColumn || selectionData.startCol;
          endRow = selectionData.endRow || startRow;
          endCol = selectionData.endColumn || selectionData.endCol || startCol;
        }
        // 패턴 C: row, col 형태
        else if (selectionData.row !== undefined) {
          console.log("🎯 패턴 C: row/col 형태 발견");
          startRow = selectionData.row;
          startCol = selectionData.col || selectionData.column || 0;
          endRow = selectionData.endRow || startRow;
          endCol = selectionData.endCol || selectionData.endColumn || startCol;
        }

        // 좌표가 발견되었으면 주소 변환
        if (startRow !== undefined && startCol !== undefined) {
          console.log(
            `📍 좌표 발견: (${startRow}, ${startCol}) → (${endRow}, ${endCol})`,
          );

          if (startRow === endRow && startCol === endCol) {
            // 단일 셀 선택
            cellAddress = coordsToAddress(startRow, startCol);
            selectionType = "single";
            console.log(
              `📍 단일 셀 선택: ${cellAddress} (row: ${startRow}, col: ${startCol})`,
            );
          } else {
            // 범위 선택
            cellAddress = rangeToAddress({
              startRow,
              startCol,
              endRow: endRow || startRow,
              endCol: endCol || startCol,
            });
            selectionType = "range";
            console.log(
              `📍 범위 선택: ${cellAddress} (${startRow},${startCol} → ${endRow},${endCol})`,
            );
          }

          console.log(`🎯 선택 타입: ${selectionType}, 주소: ${cellAddress}`);

          // zustand store에 셀 주소 저장
          const appStore = useAppStore.getState();
          appStore.setCellAddressToInsert(cellAddress);

          console.log(`✅ 셀 주소 "${cellAddress}" 스토어에 저장 완료`);
        } else {
          console.warn("⚠️ 좌표 정보를 찾을 수 없습니다:");
          console.warn("⚠️ selectionData:", selectionData);
        }
      } else {
        console.warn("⚠️ 선택 데이터를 찾을 수 없습니다:");
        console.warn("⚠️ 전체 params:", params);
      }
    } catch (error) {
      console.error("❌ 셀 선택 이벤트 처리 실패:", error);
      console.error("❌ 이벤트 파라미터:", params);
    }
  }

  /**
   * 이벤트 리스너 정리
   */
  public dispose(): void {
    if (this.disposable) {
      this.disposable.dispose();
      this.disposable = null;
      console.log("🧹 CellSelectionHandler: 이벤트 리스너 정리 완료");
    }
  }

  /**
   * 핸들러가 활성 상태인지 확인
   */
  public isActive(): boolean {
    return this.disposable !== null;
  }
}

/**
 * 전역 셀 선택 핸들러 인스턴스
 * - 싱글톤 패턴으로 관리
 */
export const cellSelectionHandler = new CellSelectionHandler();
