'use client';

/**
 * DevFill Context
 *
 * 개발/테스트용 폼 자동 채우기 기능을 위한 Context
 * - 각 페이지 컴포넌트에서 폼 채우기 함수를 등록
 * - DevToolbar에서 등록된 함수를 호출
 *
 * 사용법:
 * 1. 각 폼 컴포넌트에서 useDevFill hook으로 fillForm 함수 등록
 * 2. DevToolbar에서 버튼 클릭 시 해당 함수 호출
 */

import React, { createContext, useContext, useState, useCallback, useEffect, ReactNode } from 'react';

// 지원하는 페이지 타입
export type DevFillPageType =
  | 'quote' | 'quoteV2' | 'order' | 'workOrder' | 'workOrderComplete' | 'shipment'  // 판매/생산 플로우
  | 'deposit' | 'withdrawal' | 'purchaseApproval' | 'cardTransaction'  // 회계 플로우
  | 'client'  // 기준정보
  | 'receiving';  // 자재

// 폼 채우기 함수 타입
type FillFormFunction = (data?: unknown) => void | Promise<void>;

// Context 타입
interface DevFillContextType {
  // 현재 활성화 상태
  isEnabled: boolean;
  setIsEnabled: (enabled: boolean) => void;

  // 툴바 표시 상태
  isVisible: boolean;
  setIsVisible: (visible: boolean) => void;

  // 현재 페이지 타입
  currentPage: DevFillPageType | null;
  setCurrentPage: (page: DevFillPageType | null) => void;

  // 폼 채우기 함수 등록/해제
  registerFillForm: (pageType: DevFillPageType, fillFn: FillFormFunction) => void;
  unregisterFillForm: (pageType: DevFillPageType) => void;

  // 폼 채우기 실행
  fillForm: (pageType: DevFillPageType, data?: unknown) => Promise<void>;

  // 등록된 페이지 확인
  hasRegisteredForm: (pageType: DevFillPageType) => boolean;

  // 플로우 데이터 (이전 단계에서 생성된 ID 저장)
  flowData: FlowData;
  setFlowData: (data: Partial<FlowData>) => void;
  clearFlowData: () => void;
}

// 플로우 간 전달 데이터
interface FlowData {
  quoteId?: number;
  orderId?: number;
  workOrderId?: number;
  lotNo?: string;
}

const DevFillContext = createContext<DevFillContextType | null>(null);

// Provider Props
interface DevFillProviderProps {
  children: ReactNode;
}

export function DevFillProvider({ children }: DevFillProviderProps) {
  // 활성화 상태 (환경변수 기반) - 초기값 false로 서버/클라이언트 일치
  const [isEnabled, setIsEnabled] = useState(false);

  // 툴바 표시 상태 (localStorage 기반) - 초기값 false로 서버/클라이언트 일치
  const [isVisible, setIsVisible] = useState(false);

  // 클라이언트 마운트 후 실제 값 설정 (Hydration 불일치 방지)
  useEffect(() => {
    setIsEnabled(process.env.NEXT_PUBLIC_DEV_TOOLBAR_ENABLED === 'true');
    const stored = localStorage.getItem('devToolbarVisible');
    setIsVisible(stored === 'true');
  }, []);

  // 현재 페이지 타입
  const [currentPage, setCurrentPage] = useState<DevFillPageType | null>(null);

  // 등록된 폼 채우기 함수들
  const [fillFunctions, setFillFunctions] = useState<Map<DevFillPageType, FillFormFunction>>(new Map());

  // 플로우 데이터
  const [flowData, setFlowDataState] = useState<FlowData>({});

  // 툴바 표시 상태 저장
  const handleSetIsVisible = useCallback((visible: boolean) => {
    setIsVisible(visible);
    if (typeof window !== 'undefined') {
      localStorage.setItem('devToolbarVisible', String(visible));
    }
  }, []);

  // 폼 채우기 함수 등록
  const registerFillForm = useCallback((pageType: DevFillPageType, fillFn: FillFormFunction) => {
    setFillFunctions(prev => {
      const next = new Map(prev);
      next.set(pageType, fillFn);
      return next;
    });
  }, []);

  // 폼 채우기 함수 해제
  const unregisterFillForm = useCallback((pageType: DevFillPageType) => {
    setFillFunctions(prev => {
      const next = new Map(prev);
      next.delete(pageType);
      return next;
    });
  }, []);

  // 폼 채우기 실행
  const fillForm = useCallback(async (pageType: DevFillPageType, data?: unknown) => {
    const fillFn = fillFunctions.get(pageType);
    if (fillFn) {
      await fillFn(data);
    } else {
      console.warn(`[DevFill] No fill function registered for page: ${pageType}`);
    }
  }, [fillFunctions]);

  // 등록 여부 확인
  const hasRegisteredForm = useCallback((pageType: DevFillPageType) => {
    return fillFunctions.has(pageType);
  }, [fillFunctions]);

  // 플로우 데이터 설정
  const setFlowData = useCallback((data: Partial<FlowData>) => {
    setFlowDataState(prev => ({ ...prev, ...data }));
  }, []);

  // 플로우 데이터 초기화
  const clearFlowData = useCallback(() => {
    setFlowDataState({});
  }, []);

  // 비활성화 시 null 반환하지 않고 children만 렌더링
  // (DevToolbar에서 isEnabled 체크)

  return (
    <DevFillContext.Provider
      value={{
        isEnabled,
        setIsEnabled: () => {}, // 환경변수로 제어하므로 런타임 변경 불가
        isVisible,
        setIsVisible: handleSetIsVisible,
        currentPage,
        setCurrentPage,
        registerFillForm,
        unregisterFillForm,
        fillForm,
        hasRegisteredForm,
        flowData,
        setFlowData,
        clearFlowData,
      }}
    >
      {children}
    </DevFillContext.Provider>
  );
}

// Hook
export function useDevFillContext() {
  const context = useContext(DevFillContext);
  if (!context) {
    throw new Error('useDevFillContext must be used within a DevFillProvider');
  }
  return context;
}