'use client';

/**
 * useWikiFilter 커스텀 훅
 *
 * 위키 문서 목록의 카테고리 필터, 신뢰도 정렬, 검증 필터를 캡슐화합니다.
 * - 카테고리/정렬: URL 파라미터 동기화
 * - 검증만 보기: sessionStorage 유지 (새로고침 후 복원, 브라우저 종료 시 초기화)
 */

import { useState, useEffect, useCallback } from 'react';
import { useSearchParams, useRouter, usePathname } from 'next/navigation';
import type { Document, SourceType } from '@/types/firestore';

// ── 타입 정의 ──────────────────────────────────────────────────────────────────

export type WikiCategory = 'all' | 'regulation' | 'court_ruling' | 'policy' | 'expert' | 'community';
export type WikiSortBy = 'updatedAt' | 'authorityTier';

/** WikiDocument = Document 타입 별칭 */
export type WikiDocument = Document;

export interface WikiFilterState {
  category: WikiCategory;
  sortBy: WikiSortBy;
  verifiedOnly: boolean;
  searchParams: URLSearchParams;
}

export interface WikiFilterActions {
  setCategory: (category: WikiCategory) => void;
  setSortBy: (sort: WikiSortBy) => void;
  toggleVerifiedOnly: () => void;
  resetFilters: () => void;
}

// ── 상수 ───────────────────────────────────────────────────────────────────────

/** sessionStorage 키 */
const VERIFIED_ONLY_KEY = 'insuwiki-verified-only';

/** 카테고리 → sourceType 매핑 */
export const CATEGORY_SOURCE_MAP: Record<WikiCategory, SourceType[] | null> = {
  all: null,
  regulation: ['regulation'],
  court_ruling: ['court_ruling'],
  policy: ['policy_pdf'],
  expert: ['newsletter', 'wiki_editorial', 'kakao_expert'],
  community: ['youtube', 'kakao_community', 'user_submitted'],
};

// ── 순수 로직 함수 (테스트 가능하도록 export) ──────────────────────────────────

/**
 * 카테고리로 문서 필터링
 * - 'all'이면 전체 반환
 * - 해당 카테고리의 sourceType에 속하는 문서만 반환
 */
export function filterByCategory(documents: WikiDocument[], category: string): WikiDocument[] {
  const sourceTypes = CATEGORY_SOURCE_MAP[category as WikiCategory];
  if (!sourceTypes) return documents;
  return documents.filter((doc) => doc.sourceType && sourceTypes.includes(doc.sourceType));
}

/**
 * 검증 상태로 문서 필터링
 * - verifiedOnly=false이면 전체 반환
 * - verifiedOnly=true이면 expert_verified만 반환
 */
export function filterByVerified(documents: WikiDocument[], verifiedOnly: boolean): WikiDocument[] {
  if (!verifiedOnly) return documents;
  return documents.filter((doc) => doc.verificationStatus === 'expert_verified');
}

/**
 * 문서 정렬
 * - 'updatedAt': Firestore 원본 순서 유지 (변경 없음). favoriteIds 제공 시 즐겨찾기 우선
 * - 'authorityTier': isFavorite DESC → authorityTier ASC → createdAt DESC 순 정렬
 */
export function sortDocuments(documents: WikiDocument[], sortBy: WikiSortBy, favoriteIds?: Set<string>): WikiDocument[] {
  if (sortBy === 'updatedAt') {
    if (!favoriteIds || favoriteIds.size === 0) return [...documents];
    return [...documents].sort((a, b) => {
      const aFav = favoriteIds.has(a.id) ? 0 : 1;
      const bFav = favoriteIds.has(b.id) ? 0 : 1;
      return aFav - bFav;
    });
  }
  return [...documents].sort((a, b) => {
    if (favoriteIds && favoriteIds.size > 0) {
      const aFav = favoriteIds.has(a.id) ? 0 : 1;
      const bFav = favoriteIds.has(b.id) ? 0 : 1;
      if (aFav !== bFav) return aFav - bFav;
    }
    const tierA = a.authorityTier ?? Infinity;
    const tierB = b.authorityTier ?? Infinity;
    if (tierA !== tierB) return tierA - tierB;
    const timeA = a.createdAt?.toMillis?.() ?? 0;
    const timeB = b.createdAt?.toMillis?.() ?? 0;
    return timeB - timeA;
  });
}

// ── 훅 구현 ───────────────────────────────────────────────────────────────────

/**
 * useWikiFilter 훅
 *
 * @param documents - Firestore에서 조회한 원본 문서 배열
 * @returns filteredDocuments, state, actions
 */
export function useWikiFilter(documents: WikiDocument[], favoriteIds?: Set<string>): {
  filteredDocuments: WikiDocument[];
  state: WikiFilterState;
  actions: WikiFilterActions;
} {
  const searchParams = useSearchParams();
  const router = useRouter();
  const pathname = usePathname();

  // ── URL에서 초기값 복원 ──────────────────────────────────────────────────
  const initialCategory = (searchParams.get('category') as WikiCategory) ?? 'all';
  const initialSortBy = (searchParams.get('sort') as WikiSortBy) ?? 'updatedAt';

  // ── sessionStorage에서 verifiedOnly 초기값 복원 ─────────────────────────
  const getInitialVerifiedOnly = (): boolean => {
    try {
      return sessionStorage.getItem(VERIFIED_ONLY_KEY) === 'true';
    } catch {
      return false;
    }
  };

  const [category, setCategory] = useState<WikiCategory>(initialCategory);
  const [sortBy, setSortBy] = useState<WikiSortBy>(initialSortBy);
  const [verifiedOnly, setVerifiedOnly] = useState<boolean>(getInitialVerifiedOnly);

  // ── URL 파라미터 업데이트 ─────────────────────────────────────────────────
  const updateUrl = useCallback(
    (newCategory: WikiCategory, newSortBy: WikiSortBy) => {
      const params = new URLSearchParams(searchParams.toString());
      if (newCategory === 'all') {
        params.delete('category');
      } else {
        params.set('category', newCategory);
      }
      if (newSortBy === 'updatedAt') {
        params.delete('sort');
      } else {
        params.set('sort', newSortBy);
      }
      const qs = params.toString();
      router.replace(qs ? `${pathname}?${qs}` : pathname);
    },
    [searchParams, router, pathname]
  );

  // ── 액션 핸들러 ────────────────────────────────────────────────────────────
  const handleSetCategory = useCallback(
    (newCategory: WikiCategory) => {
      setCategory(newCategory);
      updateUrl(newCategory, sortBy);
    },
    [sortBy, updateUrl]
  );

  const handleSetSortBy = useCallback(
    (newSortBy: WikiSortBy) => {
      setSortBy(newSortBy);
      updateUrl(category, newSortBy);
    },
    [category, updateUrl]
  );

  const toggleVerifiedOnly = useCallback(() => {
    setVerifiedOnly((prev) => !prev);
  }, []);

  const resetFilters = useCallback(() => {
    setCategory('all');
    setSortBy('updatedAt');
    setVerifiedOnly(false);
    updateUrl('all', 'updatedAt');
  }, [updateUrl]);

  // ── sessionStorage 동기화 (verifiedOnly 변경 시) ───────────────────────
  useEffect(() => {
    try {
      sessionStorage.setItem(VERIFIED_ONLY_KEY, String(verifiedOnly));
    } catch {
      // 무시
    }
  }, [verifiedOnly]);

  // ── 필터 + 정렬 적용 ────────────────────────────────────────────────────
  const categoryFiltered = filterByCategory(documents, category);
  const verifiedFiltered = filterByVerified(categoryFiltered, verifiedOnly);
  const filteredDocuments = sortDocuments(verifiedFiltered, sortBy, favoriteIds);

  // ── 현재 URLSearchParams 객체 생성 ───────────────────────────────────────
  const currentSearchParams = new URLSearchParams(searchParams.toString());

  return {
    filteredDocuments,
    state: {
      category,
      sortBy,
      verifiedOnly,
      searchParams: currentSearchParams,
    },
    actions: {
      setCategory: handleSetCategory,
      setSortBy: handleSetSortBy,
      toggleVerifiedOnly,
      resetFilters,
    },
  };
}
