"use client"

import * as React from "react"
import { userRoles, type UserView } from "@/db/schema/users"
import type {
  DataTableAdvancedFilterField,
  DataTableFilterField,
  DataTableRowAction,
} from "@/types/table"

import { toSentenceCase } from "@/lib/utils"
import { useDataTable } from "@/hooks/use-data-table"
import { DataTable } from "@/components/data-table/data-table"
import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar"
import { DataTableToolbar } from "@/components/data-table/data-table-toolbar"

import type {
  getAllRoles, getUsersAll, getUsersEVCP
} from "@/lib//users/service"
import { getColumns } from "./assginedUsers-table-columns"

type TableMode = "assign" | "remove"

interface UsersTableProps {
  promises: Promise<
    [
      Awaited<ReturnType<typeof getUsersAll>>
    ]
  >
  onSelectedChange: any
  mode?: TableMode // 새로 추가: assign | remove
  currentRoleName?: string // 새로 추가: 현재 선택된 롤 ID (필터링용)
  showAllUsers?: boolean // 디버깅용: 모든 사용자 표시
}

export function AssginedUserTable({ 
  promises, 
  onSelectedChange, 
  mode = "assign",
  currentRoleName,
  showAllUsers = false 
}: UsersTableProps) {

  const [{ data: rawData, pageCount }] = React.use(promises)

  // 모드에 따라 데이터 필터링
  const filteredData = React.useMemo(() => {
    console.log('🔍 Filtering Debug Info:', {
      mode,
      currentRoleName,
      rawDataLength: rawData?.length,
      sampleUser: rawData?.[0],
      showAllUsers
    })

    // 디버깅용: 모든 사용자 표시
    if (showAllUsers) {
      console.log('🔧 Debug mode: showing all users')
      return rawData
    }

    if (!currentRoleName || !rawData) {
      console.log('❌ No currentRoleId or rawData, returning rawData')
      return rawData
    }

    if (mode === "assign") {
      // assign 모드: 현재 롤에 할당되지 않은 사용자들만 표시
      const filtered = rawData.filter(user => {
        if (!user.roles || !Array.isArray(user.roles)) {
          console.log('✅ User has no roles, including in assign:', user.user_name)
          return true
        }
        
        // 다양한 roles 구조 지원
        const hasRole = user.roles.some(role => {
          if (typeof role === 'string') return role === currentRoleName.toString()
          return false
        })
        
        if (!hasRole) {
          console.log('✅ User does not have role, including in assign:', user.user_name)
        }
        return !hasRole
      })
      
      console.log(`📊 Assign mode: ${filtered.length} users available`)
      return filtered
    } else {
      // remove 모드: 현재 롤에 할당된 사용자들만 표시  
      const filtered = rawData.filter(user => {
        if (!user.roles || !Array.isArray(user.roles)) {
          console.log('❌ User has no roles, excluding from remove:', user.user_name)
          return false
        }
        
        // 다양한 roles 구조 지원
        const hasRole = user.roles.some(role => {
          if (typeof role === 'string') return role === currentRoleName.toString()

          return false
        })
        
        if (hasRole) {
          console.log('✅ User has role, including in remove:', user.user_name, 'roles:', user.roles)
        }
        return hasRole
      })
      
      console.log(`📊 Remove mode: ${filtered.length} users with role`)
      return filtered
    }
  }, [rawData, mode, currentRoleName, showAllUsers])

  const [rowAction, setRowAction] =
    React.useState<DataTableRowAction<UserView> | null>(null)

  const columns = React.useMemo(
    () => getColumns({ setRowAction }),
    [setRowAction]
  )

  /**
   * This component can render either a faceted filter or a search filter based on the `options` prop.
   *
   * @prop options - An array of objects, each representing a filter option. If provided, a faceted filter is rendered. If not, a search filter is rendered.
   *
   * Each `option` object has the following properties:
   * @prop {string} label - The label for the filter option.
   * @prop {string} value - The value for the filter option.
   * @prop {React.ReactNode} [icon] - An optional icon to display next to the label.
   * @prop {boolean} [withCount] - An optional boolean to display the count of the filter option.
   */
  const filterFields: DataTableFilterField<UserView>[] = [
    {
      id: "user_email",
      label: "Email",
      placeholder: "Filter email...",
    },
  ]

  /**
   * Advanced filter fields for the data table.
   * These fields provide more complex filtering options compared to the regular filterFields.
   *
   * Key differences from regular filterFields:
   * 1. More field types: Includes 'text', 'multi-select', 'date', and 'boolean'.
   * 2. Enhanced flexibility: Allows for more precise and varied filtering options.
   * 3. Used with DataTableAdvancedToolbar: Enables a more sophisticated filtering UI.
   * 4. Date and boolean types: Adds support for filtering by date ranges and boolean values.
   */
  const advancedFilterFields: DataTableAdvancedFilterField<UserView>[] = [
    {
      id: "user_name",
      label: "User Name",
      type: "text",
    },
    {
      id: "user_email",
      label: "Email",
      type: "text",
    },
    {
      id: "created_at",
      label: "Created at",
      type: "date",
    },
  ]

  const { table } = useDataTable({
    data: filteredData, // 필터링된 데이터 사용
    columns,
    pageCount,
    filterFields,
    enablePinning: true,
    enableAdvancedFilter: true,
    initialState: {
      sorting: [{ id: "created_at", desc: true }],
      columnPinning: { right: ["actions"] },
    },
    getRowId: (originalRow) => `${originalRow.user_id}`,
    shallow: false,
    clearOnDefault: true,
  })

  const rowSelection = table.getState().rowSelection

  function shallowEqual(arrA: number[], arrB: number[]): boolean {
    if (arrA.length !== arrB.length) return false
    for (let i = 0; i < arrA.length; i++) {
      if (arrA[i] !== arrB[i]) return false
    }
    return true
  }
  
  const previousUserIdsRef = React.useRef<number[]>([])

  React.useEffect(() => {
    // 선택 상태가 바뀌었을 때만 실행
    if (!onSelectedChange) return
    
    const rows = table.getSelectedRowModel().rows
    const newUserIds = rows.map((r) => r.original.user_id)
  
    // 이전/새 userIds 비교
    if (!shallowEqual(previousUserIdsRef.current, newUserIds)) {
      previousUserIdsRef.current = newUserIds
      onSelectedChange(newUserIds)
    }
  }, [rowSelection, onSelectedChange])

  // 모드 변경시 선택 초기화
  React.useEffect(() => {
    table.toggleAllPageRowsSelected(false)
    setRowAction(null)
  }, [mode, table])

  return (
    <>
      {/* 빈 데이터 상태 메시지 */}
      {filteredData && filteredData.length === 0 && (
        <div className="flex flex-col items-center justify-center py-8 text-center border-2 border-dashed border-gray-200 rounded-lg">
          <div className="text-gray-500 mb-2">
            {mode === "assign" 
              ? "🎯 모든 사용자가 이미 이 롤에 할당되어 있습니다"
              : "👥 이 롤에 할당된 사용자가 없습니다"
            }
          </div>
          <div className="text-sm text-gray-400">
            {mode === "assign" 
              ? "할당 가능한 사용자가 없습니다"
              : "제거할 사용자가 없습니다"
            }
          </div>
        </div>
      )}

      <DataTable
        table={table}
      >
        <DataTableAdvancedToolbar
          table={table}
          filterFields={advancedFilterFields}
          shallow={false}
        >
        </DataTableAdvancedToolbar>
      </DataTable>
    </>
  )
}