/**
 * 완전한 로그아웃 처리
 *
 * 로그아웃 시 수행하는 작업:
 * 1. Zustand 스토어 초기화 (메모리 캐시)
 * 2. sessionStorage 캐시 삭제 (page_config_*, mes-*)
 * 3. localStorage 사용자 데이터 삭제 (mes-currentUser, mes-users)
 * 4. FCM 토큰 해제 (Capacitor 네이티브 앱)
 * 5. 서버 로그아웃 API 호출 (HttpOnly 쿠키 삭제)
 *
 * @see claudedocs/security/[PLAN-2025-12-12] tenant-data-isolation-implementation.md
 */

import { useMasterDataStore } from '@/stores/masterDataStore';
import { useItemMasterStore } from '@/stores/item-master/useItemMasterStore';
import { useAuthStore } from '@/stores/authStore';

// FCM은 Capacitor 환경에서만 사용 (동적 import로 웹 빌드 에러 방지)

// ===== 캐시 삭제 대상 Prefix =====

const SESSION_STORAGE_PREFIXES = [
  'page_config_',  // masterDataStore 페이지 구성 캐시
  'mes-',          // TenantAwareCache 테넌트 캐시
];

const LOCAL_STORAGE_KEYS = [
  'mes-currentUser',  // 현재 사용자 정보
  'mes-users',        // 사용자 목록
];

const LOCAL_STORAGE_PREFIXES = [
  'mes-',  // 테넌트 캐시 (mes-{tenantId}-*)
];

// ===== 캐시 정리 함수 =====

/**
 * sessionStorage에서 우리 앱 캐시만 삭제
 * - page_config_* (페이지 구성)
 * - mes-* (테넌트 캐시)
 */
export function clearSessionStorageCache(): void {
  if (typeof window === 'undefined') return;

  const keysToRemove: string[] = [];

  Object.keys(sessionStorage).forEach((key) => {
    if (SESSION_STORAGE_PREFIXES.some((prefix) => key.startsWith(prefix))) {
      keysToRemove.push(key);
    }
  });

  keysToRemove.forEach((key) => {
    sessionStorage.removeItem(key);
  });
}

/**
 * localStorage에서 사용자 데이터 및 테넌트 캐시 삭제
 */
export function clearLocalStorageCache(): void {
  if (typeof window === 'undefined') return;

  // 특정 키 삭제
  LOCAL_STORAGE_KEYS.forEach((key) => {
    if (localStorage.getItem(key)) {
      localStorage.removeItem(key);
    }
  });

  // Prefix 기반 삭제
  const keysToRemove: string[] = [];

  Object.keys(localStorage).forEach((key) => {
    if (LOCAL_STORAGE_PREFIXES.some((prefix) => key.startsWith(prefix))) {
      keysToRemove.push(key);
    }
  });

  keysToRemove.forEach((key) => {
    localStorage.removeItem(key);
  });
}

/**
 * Zustand 스토어 초기화
 */
export function resetZustandStores(): void {
  try {
    // authStore 초기화
    useAuthStore.getState().resetAllData();

    // masterDataStore 초기화
    const masterDataStore = useMasterDataStore.getState();
    masterDataStore.reset();

    // itemMasterStore 초기화
    const itemMasterStore = useItemMasterStore.getState();
    itemMasterStore.reset();

    // favoritesStore는 persist 연동이라 setFavorites([])하면 localStorage까지 비워짐
    // 로그인 시 rehydrate로 새 유저 데이터 로드하므로 여기서는 건드리지 않음
  } catch (error) {
    console.error('[Logout] Failed to reset Zustand stores:', error);
  }
}

/**
 * 서버 로그아웃 API 호출
 * - HttpOnly 쿠키 삭제 (access_token, refresh_token)
 */
export async function callLogoutAPI(): Promise<boolean> {
  try {
    const response = await fetch('/api/auth/logout', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
    });

    if (!response.ok) {
      console.warn('[Logout] Server logout failed:', response.status);
      return false;
    }

    return true;
  } catch (error) {
    console.error('[Logout] Server logout error:', error);
    return false;
  }
}

// ===== 통합 로그아웃 함수 =====

/**
 * 완전한 로그아웃 수행
 *
 * 실행 순서:
 * 1. Zustand 스토어 초기화 (즉시 UI 반영)
 * 2. sessionStorage 캐시 삭제
 * 3. localStorage 사용자 데이터 삭제
 * 4. FCM 토큰 해제 (Capacitor 네이티브 앱)
 * 5. 서버 로그아웃 API 호출
 *
 * @param options.skipServerLogout - 서버 로그아웃 생략 여부 (기본: false)
 * @param options.redirectTo - 로그아웃 후 리다이렉트 경로 (기본: null)
 * @returns 로그아웃 성공 여부
 */
export async function performFullLogout(options?: {
  skipServerLogout?: boolean;
  redirectTo?: string | null;
}): Promise<boolean> {
  const { skipServerLogout = false, redirectTo = null } = options || {};


  try {
    // 1. Zustand 스토어 초기화 (즉시 UI 반영)
    resetZustandStores();

    // 2. sessionStorage 캐시 삭제
    clearSessionStorageCache();

    // 3. localStorage 사용자 데이터 삭제
    clearLocalStorageCache();

    // 4. FCM 토큰 해제 (Capacitor 네이티브 앱에서만 실행)
    // 동적 import로 @capacitor/core 빌드 에러 방지
    try {
      const fcm = await import('@/lib/capacitor/fcm');
      if (fcm.isCapacitorNative()) {
        await fcm.unregisterFCMToken();
      }
    } catch {
      // Capacitor 모듈이 없는 환경 (웹) - 무시
    }

    // 5. 서버 로그아웃 API 호출 (HttpOnly 쿠키 삭제)
    if (!skipServerLogout) {
      await callLogoutAPI();
    }


    // 6. 리다이렉트 (선택적)
    if (redirectTo && typeof window !== 'undefined') {
      window.location.href = redirectTo;
    }

    return true;
  } catch (error) {
    console.error('[Logout] Full logout failed:', error);
    return false;
  }
}

// ===== 유틸리티 함수 =====

/**
 * 현재 캐시 상태 확인 (디버깅용)
 */
export function debugCacheStatus(): void {
  if (typeof window === 'undefined') {
    return;
  }

  console.group('[Debug] Cache Status');

  // sessionStorage
  Object.keys(sessionStorage).filter((key) =>
    SESSION_STORAGE_PREFIXES.some((prefix) => key.startsWith(prefix))
  );

  // localStorage
  Object.keys(localStorage).filter(
    (key) =>
      LOCAL_STORAGE_KEYS.includes(key) ||
      LOCAL_STORAGE_PREFIXES.some((prefix) => key.startsWith(prefix))
  );

  // Zustand
  useMasterDataStore.getState();

  useItemMasterStore.getState();

  console.groupEnd();
}