import { NativeModules, Platform } from 'react-native';
import { Bootpay } from './Bootpay';
import { BootpayWidget } from './BootpayWidget';
import { BootpayCommerce } from './BootpayCommerce';
import { setEnvironmentMode } from './environment';
import {
  Payload,
  Extra,
  Item,
  User,
} from './BootpayTypes';
import {
  WidgetPayload,
  WidgetPayloadExtra,
} from './WidgetTypes';
import {
  CommercePayload,
  CommerceUser,
  CommerceProduct,
  CommerceExtra,
} from './CommerceTypes';

export type {
  BootpayEventData,
  BootpayTypesProps,
} from './BootpayTypes';
export type {
  WidgetData,
  WidgetTerm,
  WidgetExtra,
  BootpayWidgetProps,
  WidgetReadyCallback,
  WidgetResizeCallback,
  WidgetChangePaymentCallback,
  WidgetChangeTermsCallback,
} from './WidgetTypes';
export type {
  CommerceEventData,
  BootpayCommerceProps,
} from './CommerceTypes';

const BPCWebViewModule = NativeModules.BPCWebViewModule;

// 자동 warmUp 상태 관리
let _autoWarmUpCalled = false;

/**
 * 내부 자동 warmUp 함수
 * 패키지 import 시 자동으로 호출되어 WebView 프로세스를 미리 초기화합니다.
 */
const _autoWarmUp = (): void => {
  if (_autoWarmUpCalled) return;
  _autoWarmUpCalled = true;

  // iOS/Android에서만 동작
  if (Platform.OS !== 'ios' && Platform.OS !== 'android') return;

  try {
    if (BPCWebViewModule?.warmUp) {
      BPCWebViewModule.warmUp();
      if (__DEV__) {
        console.log('[Bootpay] WebView auto warm-up initiated');
      }
    }
  } catch (e) {
    // warmUp 실패해도 결제 기능에는 영향 없음
  }
};

/**
 * WebView 프로세스를 미리 초기화하여 첫 결제 화면 로딩 속도를 개선합니다.
 *
 * iOS: WKWebView의 첫 생성 시 GPU, Networking, WebContent 프로세스 초기화에 3-7초 소요
 * Android: Chromium 엔진 초기화에 200-300ms 소요
 *
 * 참고: SDK import 시 자동으로 warmUp이 호출되므로, 일반적으로 명시적 호출이 필요하지 않습니다.
 *
 * @example
 * ```tsx
 * // 자동 warmUp이 기본 동작이므로, 별도 호출 불필요
 * // 필요한 경우에만 명시적으로 호출
 * import { warmUp } from 'react-native-bootpay-api';
 * warmUp();
 * ```
 */
export const warmUp = (): void => {
  if (BPCWebViewModule?.warmUp) {
    BPCWebViewModule.warmUp();
  }
};

/**
 * 프리워밍된 WebView 리소스를 해제합니다.
 * 메모리가 부족할 때 호출할 수 있습니다.
 *
 * @example
 * ```tsx
 * import { releaseWarmUp } from 'react-native-bootpay-api';
 *
 * // 메모리 정리가 필요할 때
 * releaseWarmUp();
 * ```
 */
export const releaseWarmUp = (): void => {
  if (BPCWebViewModule?.releaseWarmUp) {
    BPCWebViewModule.releaseWarmUp();
  }
};

// 패키지 import 시 자동으로 warmUp 실행
_autoWarmUp();

export {
  // 기존 결제 컴포넌트
  Bootpay,
  Payload,
  Extra,
  Item,
  User,
  // Widget 컴포넌트
  BootpayWidget,
  WidgetPayload,
  WidgetPayloadExtra,
  // Commerce 컴포넌트
  BootpayCommerce,
  CommercePayload,
  CommerceUser,
  CommerceProduct,
  CommerceExtra,
  // 환경 모드 (development | stage | production)
  setEnvironmentMode,
};
export type { BootpayEnvironmentMode } from './environment';
