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

type BiddingFailureItem = {
  id: number
  biddingNumber: string
  originalBiddingNumber: string | null
  title: string
  status: string
  contractType: string
  prNumber: string | null

  // 가격 정보
  targetPrice: number | null
  currency: string | null

  // 일정 정보
  biddingRegistrationDate: Date | null
  submissionStartDate: Date | null
  submissionEndDate: Date | null

  // 담당자 정보
  bidPicName: string | null
  supplyPicName: string | null

  // 유찰 정보
  disposalDate: Date | null // 유찰일
  disposalUpdatedAt: Date | null // 폐찰수정일
  disposalUpdatedBy: string | null // 폐찰수정자

  // 기타 정보
  createdBy: string | null
  createdAt: Date | null
  updatedAt: Date | null
  updatedBy: string | null
}

interface BiddingsFailureTableProps {
    promises: Promise<
        [
            Awaited<ReturnType<typeof getBiddingsForFailure>>
        ]
    >
}

export function BiddingsFailureTable({ promises }: BiddingsFailureTableProps) {
    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<BiddingFailureItem | null>(null)

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

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

    const columns = React.useMemo(
        () => getBiddingsFailureColumns({ 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 "history":
                    // 이력보기 (추후 구현)
                    console.log('이력보기:', rowAction.row.original)
                    break
                case "rebid":
                    // 재입찰 (추후 구현)
                    console.log('재입찰:', rowAction.row.original)
                    break
                default:
                    break
            }
        }
    }, [rowAction])

    const filterFields: DataTableFilterField<BiddingFailureItem>[] = [
        {
            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<BiddingFailureItem>[] = [
        { 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: "biddingRegistrationDate", label: "입찰등록일", type: "date" },
        { id: "disposalDate", label: "유찰일", type: "date" },
        { id: "disposalUpdatedAt", label: "폐찰일", type: "date" },
    ]

    const { table } = useDataTable({
        data,
        columns,
        pageCount,
        filterFields,
        enablePinning: true,
        enableAdvancedFilter: true,
        initialState: {
            sorting: [{ id: "disposalDate", 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="biddingsFailureTableCompact"
                    onCompactChange={handleCompactChange}
                >
                </DataTableAdvancedToolbar>
            </DataTable>

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

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