import { useState, useCallback, useEffect, useMemo } from "react";
import { User, UserSearchFilter } from "@/types/user";
import { userAPI } from "@/lib/api/user"; // 백엔드 연동 활성화
import { PaginationInfo } from "@/components/common/Pagination";
import { useDebounce } from "./useDebounce";
// import { MOCK_USERS } from "@/constants/user"; // 목 데이터 비활성화

/**
 * 사용자 관리 비즈니스 로직을 담당하는 커스텀 훅
 */
export const useUserManagement = () => {
  // 사용자 목록 상태
  const [users, setUsers] = useState<User[]>([]);

  // SUPER_ADMIN cross-tenant 응답 메타 (truncated/failed 안내 배너용)
  const [crossTenantMeta, setCrossTenantMeta] = useState<Record<string, any> | null>(null);

  // 검색 필터 상태
  const [searchFilter, setSearchFilter] = useState<UserSearchFilter>({});

  // 통합 검색어 디바운싱 (500ms 지연)
  const debouncedSearchValue = useDebounce(searchFilter.search_value || "", 500);

  // 고급 검색 필드들 디바운싱
  const debouncedSabun = useDebounce(searchFilter.search_sabun || "", 500);
  const debouncedCompanyName = useDebounce(searchFilter.search_company_name || "", 500);
  const debouncedDeptName = useDebounce(searchFilter.search_dept_name || "", 500);
  const debouncedPositionName = useDebounce(searchFilter.search_position_name || "", 500);
  const debouncedUserId = useDebounce(searchFilter.search_user_id || "", 500);
  const debouncedUserName = useDebounce(searchFilter.search_user_name || "", 500);
  const debouncedTel = useDebounce(searchFilter.search_tel || "", 500);
  const debouncedEmail = useDebounce(searchFilter.search_email || "", 500);

  // 디바운싱된 검색 필터 (useMemo로 최적화)
  const debouncedSearchFilter = useMemo(
    () => ({
      // 통합 검색
      search_value: debouncedSearchValue,

      // 고급 검색
      search_sabun: debouncedSabun,
      search_company_name: debouncedCompanyName,
      search_dept_name: debouncedDeptName,
      search_position_name: debouncedPositionName,
      search_user_id: debouncedUserId,
      search_user_name: debouncedUserName,
      search_tel: debouncedTel,
      search_email: debouncedEmail,

      // 하위 호환성
      search_type: searchFilter.search_type || "all",
    }),
    [
      debouncedSearchValue,
      debouncedSabun,
      debouncedCompanyName,
      debouncedDeptName,
      debouncedPositionName,
      debouncedUserId,
      debouncedUserName,
      debouncedTel,
      debouncedEmail,
      searchFilter.search_type,
    ],
  );

  // 검색 중인지 확인 (모든 검색 필드를 고려)
  const isSearching = useMemo(() => {
    return (
      (searchFilter.search_value || "") !== debouncedSearchValue ||
      (searchFilter.search_sabun || "") !== debouncedSabun ||
      (searchFilter.search_company_name || "") !== debouncedCompanyName ||
      (searchFilter.search_dept_name || "") !== debouncedDeptName ||
      (searchFilter.search_position_name || "") !== debouncedPositionName ||
      (searchFilter.search_user_id || "") !== debouncedUserId ||
      (searchFilter.search_user_name || "") !== debouncedUserName ||
      (searchFilter.search_tel || "") !== debouncedTel ||
      (searchFilter.search_email || "") !== debouncedEmail
    );
  }, [
    searchFilter.search_value,
    debouncedSearchValue,
    searchFilter.search_sabun,
    debouncedSabun,
    searchFilter.search_company_name,
    debouncedCompanyName,
    searchFilter.search_dept_name,
    debouncedDeptName,
    searchFilter.search_position_name,
    debouncedPositionName,
    searchFilter.search_user_id,
    debouncedUserId,
    searchFilter.search_user_name,
    debouncedUserName,
    searchFilter.search_tel,
    debouncedTel,
    searchFilter.search_email,
    debouncedEmail,
  ]);

  // 로딩 및 에러 상태
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);

  // 페이지네이션 상태
  const [currentPage, setCurrentPage] = useState(1);
  const [pageSize, setPageSize] = useState(20);
  const [totalItems, setTotalItems] = useState(0);

  // 사용자 목록 로드 (새로운 통합 검색 방식)
  const loadUsers = useCallback(
    async (filter?: UserSearchFilter) => {
      setIsLoading(true);
      setError(null);

      try {
        // 검색 파라미터 구성
        const searchParams: Record<string, string | number | undefined> = {
          page: currentPage,
          countPerPage: pageSize,
        };

        // 검색 조건 추가
        if (filter) {
          // 통합 검색 (우선순위 최고)
          if (filter.search_value && filter.search_value.trim()) {
            searchParams.search = filter.search_value.trim();
          }

          // 고급 검색 (개별 필드별)
          if (filter.search_sabun && filter.search_sabun.trim()) {
            searchParams.search_sabun = filter.search_sabun.trim();
          }
          if (filter.search_company_name && filter.search_company_name.trim()) {
            searchParams.search_company_name = filter.search_company_name.trim();
          }
          if (filter.search_dept_name && filter.search_dept_name.trim()) {
            searchParams.search_dept_name = filter.search_dept_name.trim();
          }
          if (filter.search_position_name && filter.search_position_name.trim()) {
            searchParams.search_position_name = filter.search_position_name.trim();
          }
          if (filter.search_user_id && filter.search_user_id.trim()) {
            searchParams.search_user_id = filter.search_user_id.trim();
          }
          if (filter.search_user_name && filter.search_user_name.trim()) {
            searchParams.search_user_name = filter.search_user_name.trim();
          }
          if (filter.search_tel && filter.search_tel.trim()) {
            searchParams.search_tel = filter.search_tel.trim();
          }
          if (filter.search_email && filter.search_email.trim()) {
            searchParams.search_email = filter.search_email.trim();
          }

          // 하위 호환성: 기존 search_type/search_value 방식 지원
          if (!filter.search_value && filter.search_type && filter.search_type !== "all" && searchParams.search_value) {
            // 기존 방식 변환은 일단 제거 (통합 검색과 고급 검색만 지원)
          }
        }

        console.log("🔍 검색 파라미터:", searchParams);
        const response = await userAPI.getList(searchParams);

        // cross-tenant 메타 (truncated/failed 안내 배너에서 사용). 단일 모드면 null.
        setCrossTenantMeta((response as any)?.cross_tenant_meta ?? null);

        // 백엔드 응답 구조에 맞게 처리 { success, data, total }
        if (response && response.success && response.data) {
          // 새로운 API 응답 구조: { success, data: { users, pagination } }
          if (response.data.users && Array.isArray(response.data.users)) {
            setUsers(response.data.users);
            setTotalItems(response.data.pagination?.total_count || response.data.users.length);
          } else if (Array.isArray(response.data)) {
            // 기존 구조: { success, data: User[] }
            setUsers(response.data);
            setTotalItems(response.total || response.data.length);
          } else {
            setUsers([]);
            setTotalItems(0);
          }
        } else {
          setUsers([]);
          setTotalItems(0);
        }
      } catch (err) {
        setError(err instanceof Error ? err.message : "사용자 목록 조회에 실패했습니다.");
        setUsers([]);
        setTotalItems(0);
      } finally {
        setIsLoading(false);
      }
    },
    [currentPage, pageSize],
  );

  // 초기 로드
  useEffect(() => {
    loadUsers();
  }, [loadUsers]);

  // 디바운싱된 검색 조건이 변경될 때마다 API 호출
  useEffect(() => {
    loadUsers(debouncedSearchFilter);
  }, [
    debouncedSearchFilter.search_value,
    debouncedSearchFilter.search_sabun,
    debouncedSearchFilter.search_company_name,
    debouncedSearchFilter.search_dept_name,
    debouncedSearchFilter.search_position_name,
    debouncedSearchFilter.search_user_id,
    debouncedSearchFilter.search_user_name,
    debouncedSearchFilter.search_tel,
    debouncedSearchFilter.search_email,
    loadUsers,
  ]);

  // 검색 필터 업데이트
  const updateSearchFilter = useCallback((newFilter: Partial<UserSearchFilter>) => {
    setSearchFilter((prev) => ({ ...prev, ...newFilter }));

    // 검색 조건이 변경될 때마다 첫 페이지로 이동
    const hasSearchChange = !!(
      newFilter.search_value !== undefined ||
      newFilter.search_sabun !== undefined ||
      newFilter.search_company_name !== undefined ||
      newFilter.search_dept_name !== undefined ||
      newFilter.search_position_name !== undefined ||
      newFilter.search_user_id !== undefined ||
      newFilter.search_user_name !== undefined ||
      newFilter.search_tel !== undefined ||
      newFilter.search_email !== undefined ||
      newFilter.search_type !== undefined
    );

    if (hasSearchChange) {
      setCurrentPage(1);
    }
  }, []);

  // 페이지 변경 핸들러
  const handlePageChange = useCallback((page: number) => {
    setCurrentPage(page);
  }, []);

  // 페이지 크기 변경 핸들러
  const handlePageSizeChange = useCallback((newPageSize: number) => {
    setPageSize(newPageSize);
    setCurrentPage(1); // 페이지 크기 변경 시 첫 페이지로 이동
  }, []);

  // 페이지네이션 정보 계산
  const paginationInfo: PaginationInfo = {
    currentPage,
    totalPages: Math.ceil(totalItems / pageSize),
    totalItems,
    itemsPerPage: pageSize,
    startItem: totalItems > 0 ? (currentPage - 1) * pageSize + 1 : 0,
    endItem: Math.min(currentPage * pageSize, totalItems),
  };

  // 사용자 편집 기능 제거됨

  // 사용자 삭제 기능 제거됨

  // 사용자 상태 토글 핸들러
  const handleStatusToggle = useCallback(async (user: User, newStatus: string) => {
    try {
      console.log(`🎛️ 상태 변경: ${user.user_name} (${user.user_id}) → ${newStatus}`);

      // 백엔드 API 호출
      // cross-tenant 모드: row 의 company_code 가 어느 회사 DB 사용자인지 알려줌.
      // 단일 모드: 세번째 인자 무시 (백엔드가 JWT.company_code 사용).
      const response = await userAPI.updateStatus(user.user_id, newStatus, (user as any).company_code);

      // 백엔드 응답 구조: { result: boolean, msg: string }
      if (response && typeof response === "object" && "result" in response) {
        const apiResponse = response as unknown as { result: boolean; msg: string };

        if (apiResponse.result) {
          console.log("✅ 상태 변경 성공:", apiResponse.msg);

          // 전체 목록 새로고침 대신 개별 사용자 상태만 업데이트
          setUsers((prevUsers) => prevUsers.map((u) => (u.user_id === user.user_id ? { ...u, status: newStatus } : u)));
        } else {
          console.error("❌ 상태 변경 실패:", apiResponse.msg);
          alert(apiResponse.msg || "상태 변경에 실패했습니다.");
        }
      } else {
        console.error("❌ 예상치 못한 응답 형식:", response);
        alert("상태 변경 중 오류가 발생했습니다.");
      }
    } catch (error) {
      console.error("상태 변경 오류:", error);
      alert("상태 변경 중 오류가 발생했습니다.");
    }
  }, []);

  // 데이터 새로고침 (비밀번호 초기화 후 목록 갱신용)
  const refreshData = useCallback(() => {
    loadUsers(debouncedSearchFilter);
  }, [loadUsers, debouncedSearchFilter]);

  // 사용자 등록 핸들러
  const handleCreate = useCallback(() => {
    console.log("📝 사용자 등록");
    alert("사용자 등록 기능은 추후 구현 예정입니다.");
  }, []);

  // 에러 상태 초기화
  const clearError = useCallback(() => {
    setError(null);
  }, []);

  return {
    // 데이터
    users,
    searchFilter,
    isLoading,
    isSearching,
    error,
    paginationInfo,
    crossTenantMeta,

    // 검색 기능
    updateSearchFilter,

    // 페이지네이션
    handlePageChange,
    handlePageSizeChange,

    // 액션 핸들러
    handleStatusToggle,
    handleCreate,

    // 유틸리티
    loadUsers,
    refreshData,
    clearError,
  };
};
