"use client"

import * as React from "react"
import { useRouter } from "next/navigation"
import { useSession } from "next-auth/react"
import type {
    DataTableAdvancedFilterField,
    DataTableFilterField,
    DataTableRowAction,
} from "@/types/table"

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 { getBiddingsSelectionColumns } from "./biddings-selection-columns"
import { getBiddingsForSelection } from "@/lib/bidding/service"
import {
    biddingStatusLabels,
    contractTypeLabels,
} from "@/db/schema"
import { SpecificationMeetingDialog, PrDocumentsDialog } from "../list/bidding-detail-dialogs"

type BiddingSelectionItem = {
  id: number
  biddingNumber: string
  originalBiddingNumber: string | null
  title: string
  status: string
  contractType: string
  prNumber: string | null
  submissionStartDate: Date | null
  submissionEndDate: Date | null
  bidPicName: string | null
  supplyPicName: string | null
  createdBy: string | null
  createdAt: Date | null
  updatedAt: Date | null

  // 입찰 결과 정보 (개찰 이후에만 의미 있음)
  participantCount?: number
  submittedCount?: number
  avgBidPrice?: number | null
  minBidPrice?: number | null
  maxBidPrice?: number | null
  targetPrice?: number | null
  currency?: string | null
}

interface BiddingsSelectionTableProps {
    promises: Promise<
        [
            Awaited<ReturnType<typeof getBiddingsForSelection>>
        ]
    >
}

export function BiddingsSelectionTable({ promises }: BiddingsSelectionTableProps) {
    const [biddingsResult] = React.use(promises)

    // biddingsResult에서 data와 pageCount 추출
    const { data, pageCount } = biddingsResult

    const [isCompact, setIsCompact] = React.useState<boolean>(false)
    const [specMeetingDialogOpen, setSpecMeetingDialogOpen] = React.useState(false)
    const [prDocumentsDialogOpen, setPrDocumentsDialogOpen] = React.useState(false)
    const [selectedBidding, setSelectedBidding] = React.useState<BiddingSelectionItem | null>(null)

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

    const router = useRouter()
    const { data: session } = useSession()

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

    // rowAction 변경 감지하여 해당 다이얼로그 열기
    React.useEffect(() => {
        if (rowAction) {
            setSelectedBidding(rowAction.row.original)

            switch (rowAction.type) {
                case "view":
                    // 상세 페이지로 이동
                    router.push(`/evcp/bid/${rowAction.row.original.id}`)
                    break
                case "detail":
                    // 상세분석 페이지로 이동 (추후 구현)
                    router.push(`/evcp/bid-selection/${rowAction.row.original.id}/detail`)
                    break
                case "close_bidding":
                    // 입찰마감 (추후 구현)
                    console.log('입찰마감:', rowAction.row.original)
                    break
                case "evaluate_bidding":
                    // 평가하기 (추후 구현)
                    console.log('평가하기:', rowAction.row.original)
                    break
                default:
                    break
            }
        }
    }, [rowAction])

    const filterFields: DataTableFilterField<BiddingSelectionItem>[] = [
        {
            id: "biddingNumber",
            label: "입찰번호",
            type: "text",
            placeholder: "입찰번호를 입력하세요",
        },
        {
            id: "prNumber",
            label: "P/R번호",
            type: "text",
            placeholder: "P/R번호를 입력하세요",
        },
        {
            id: "title",
            label: "입찰명",
            type: "text",
            placeholder: "입찰명을 입력하세요",
        },
    ]

    const advancedFilterFields: DataTableAdvancedFilterField<BiddingSelectionItem>[] = [
        { id: "title", label: "입찰명", type: "text" },
        { id: "biddingNumber", label: "입찰번호", type: "text" },
        { id: "bidPicName", label: "입찰담당자", type: "text" },
        {
            id: "status",
            label: "진행상태",
            type: "multi-select",
            options: Object.entries(biddingStatusLabels).map(([value, label]) => ({
                label,
                value,
            })),
        },
        {
            id: "contractType",
            label: "계약구분",
            type: "select",
            options: Object.entries(contractTypeLabels).map(([value, label]) => ({
                label,
                value,
            })),
        },
        { id: "createdAt", label: "등록일", type: "date" },
        { id: "submissionStartDate", label: "제출시작일", type: "date" },
        { id: "submissionEndDate", label: "제출마감일", type: "date" },
    ]

    const { table } = useDataTable({
        data,
        columns,
        pageCount,
        filterFields,
        enablePinning: true,
        enableAdvancedFilter: true,
        initialState: {
            sorting: [{ id: "createdAt", desc: true }],
            columnPinning: { right: ["actions"] },
        },
        getRowId: (originalRow) => String(originalRow.id),
        shallow: false,
        clearOnDefault: true,
    })

    const handleCompactChange = React.useCallback((compact: boolean) => {
        setIsCompact(compact)
    }, [])

    const handleSpecMeetingDialogClose = React.useCallback(() => {
        setSpecMeetingDialogOpen(false)
        setRowAction(null)
        setSelectedBidding(null)
    }, [])

    const handlePrDocumentsDialogClose = React.useCallback(() => {
        setPrDocumentsDialogOpen(false)
        setRowAction(null)
        setSelectedBidding(null)
    }, [])

    return (
        <>
            <DataTable
                table={table}
                compact={isCompact}
            >
                <DataTableAdvancedToolbar
                    table={table}
                    filterFields={advancedFilterFields}
                    shallow={false}
                    enableCompactToggle={true}
                    compactStorageKey="biddingsSelectionTableCompact"
                    onCompactChange={handleCompactChange}
                >
                </DataTableAdvancedToolbar>
            </DataTable>

            {/* 사양설명회 다이얼로그 */}
            <SpecificationMeetingDialog
                open={specMeetingDialogOpen}
                onOpenChange={handleSpecMeetingDialogClose}
                bidding={selectedBidding}
            />

            {/* PR 문서 다이얼로그 */}
            <PrDocumentsDialog
                open={prDocumentsDialogOpen}
                onOpenChange={handlePrDocumentsDialogClose}
                bidding={selectedBidding}
            />
        </>
    )
}
