"use client"

import * as React from "react"
import { type ColumnDef } from "@tanstack/react-table"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import {
  Eye, Calendar, FileX, DollarSign, AlertTriangle, RefreshCw
} from "lucide-react"
import {
  Tooltip,
  TooltipContent,
  TooltipProvider,
  TooltipTrigger,
} from "@/components/ui/tooltip"
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header"
import {
  biddingStatusLabels,
  contractTypeLabels,
} from "@/db/schema"
import { formatDate } from "@/lib/utils"
import { DataTableRowAction } from "@/types/table"

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 GetColumnsProps {
  setRowAction: React.Dispatch<React.SetStateAction<DataTableRowAction<BiddingFailureItem> | null>>
}

// 상태별 배지 색상
const getStatusBadgeVariant = (status: string) => {
  switch (status) {
    case 'bidding_disposal':
      return 'destructive'
    default:
      return 'outline'
  }
}

// 금액 포맷팅
const formatCurrency = (amount: string | number | null, currency = 'KRW') => {
  if (!amount) return '-'

  const numAmount = typeof amount === 'string' ? parseFloat(amount) : amount
  if (isNaN(numAmount)) return '-'

  return new Intl.NumberFormat('ko-KR', {
    style: 'currency',
    currency: currency,
    minimumFractionDigits: 0,
    maximumFractionDigits: 0,
  }).format(numAmount)
}

export function getBiddingsFailureColumns({ setRowAction }: GetColumnsProps): ColumnDef<BiddingFailureItem>[] {

  return [
    // ░░░ 입찰번호 ░░░
    {
      accessorKey: "biddingNumber",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="입찰번호" />,
      cell: ({ row }) => (
        <div className="font-mono text-sm">
          {row.original.biddingNumber}
        </div>
      ),
      size: 120,
      meta: { excelHeader: "입찰번호" },
    },

    // ░░░ 입찰명 ░░░
    {
      accessorKey: "title",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="입찰명" />,
      cell: ({ row }) => (
        <div className="truncate max-w-[200px]" title={row.original.title}>
          <Button
            variant="link"
            className="p-0 h-auto text-left justify-start font-bold underline"
            onClick={() => setRowAction({ row, type: "view" })}
          >
            <div className="whitespace-pre-line">
              {row.original.title}
            </div>
          </Button>
        </div>
      ),
      size: 200,
      meta: { excelHeader: "입찰명" },
    },

    // ░░░ 진행상태 ░░░
    {
      accessorKey: "status",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="진행상태" />,
      cell: ({ row }) => (
        <Badge variant={getStatusBadgeVariant(row.original.status)}>
          {biddingStatusLabels[row.original.status]}
        </Badge>
      ),
      size: 120,
      meta: { excelHeader: "진행상태" },
    },

    // ░░░ 계약구분 ░░░
    {
      accessorKey: "contractType",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="계약구분" />,
      cell: ({ row }) => (
        <Badge variant="outline">
          {contractTypeLabels[row.original.contractType]}
        </Badge>
      ),
      size: 100,
      meta: { excelHeader: "계약구분" },
    },

    // ░░░ 내정가 ░░░
    {
      accessorKey: "targetPrice",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="내정가" />,
      cell: ({ row }) => {
        const price = row.original.targetPrice
        const currency = row.original.currency || 'KRW'

        return (
          <div className="text-sm font-medium text-orange-600">
            {price ? formatCurrency(price, currency) : '-'}
          </div>
        )
      },
      size: 120,
      meta: { excelHeader: "내정가" },
    },

    // ░░░ 통화 ░░░
    {
      accessorKey: "currency",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="통화" />,
      cell: ({ row }) => (
        <span className="font-mono text-sm">{row.original.currency || 'KRW'}</span>
      ),
      size: 60,
      meta: { excelHeader: "통화" },
    },

    // ░░░ 입찰등록일 ░░░
    {
      accessorKey: "biddingRegistrationDate",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="입찰등록일" />,
      cell: ({ row }) => (
        <span className="text-sm">{formatDate(row.original.biddingRegistrationDate, "KR")}</span>
      ),
      size: 100,
      meta: { excelHeader: "입찰등록일" },
    },

    // ░░░ 입찰담당자 ░░░
    {
      accessorKey: "bidPicName",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="입찰담당자" />,
      cell: ({ row }) => {
        const bidPic = row.original.bidPicName
        const supplyPic = row.original.supplyPicName

        const displayName = bidPic || supplyPic || "-"
        return <span className="text-sm">{displayName}</span>
      },
      size: 100,
      meta: { excelHeader: "입찰담당자" },
    },

    // ░░░ 유찰일 ░░░
    {
      id: "disposalDate",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="유찰일" />,
      cell: ({ row }) => (
        <div className="flex items-center gap-1">
          <AlertTriangle className="h-4 w-4 text-red-500" />
          <span className="text-sm">{formatDate(row.original.disposalDate, "KR")}</span>
        </div>
      ),
      size: 100,
      meta: { excelHeader: "유찰일" },
    },

    // ░░░ 폐찰일 ░░░
    {
      id: "disposalUpdatedAt",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="폐찰일" />,
      cell: ({ row }) => (
        <div className="flex items-center gap-1">
          <FileX className="h-4 w-4 text-red-500" />
          <span className="text-sm">{formatDate(row.original.disposalUpdatedAt, "KR")}</span>
        </div>
      ),
      size: 100,
      meta: { excelHeader: "폐찰일" },
    },

    // ░░░ 폐찰수정자 ░░░
    {
      id: "disposalUpdatedBy",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="폐찰수정자" />,
      cell: ({ row }) => (
        <span className="text-sm">{row.original.disposalUpdatedBy || '-'}</span>
      ),
      size: 100,
      meta: { excelHeader: "폐찰수정자" },
    },

    // ░░░ P/R번호 ░░░
    {
      accessorKey: "prNumber",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="P/R번호" />,
      cell: ({ row }) => (
        <span className="font-mono text-sm">{row.original.prNumber || '-'}</span>
      ),
      size: 100,
      meta: { excelHeader: "P/R번호" },
    },

    // ░░░ 등록자 ░░░
    {
      accessorKey: "createdBy",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="등록자" />,
      cell: ({ row }) => (
        <span className="text-sm">{row.original.createdBy || '-'}</span>
      ),
      size: 100,
      meta: { excelHeader: "등록자" },
    },

    // ░░░ 등록일시 ░░░
    {
      accessorKey: "createdAt",
      header: ({ column }) => <DataTableColumnHeaderSimple column={column} title="등록일시" />,
      cell: ({ row }) => (
        <span className="text-sm">{formatDate(row.original.createdAt, "KR")}</span>
      ),
      size: 100,
      meta: { excelHeader: "등록일시" },
    },

    // ═══════════════════════════════════════════════════════════════
    // 액션
    // ═══════════════════════════════════════════════════════════════
    {
      id: "actions",
      header: "액션",
      cell: ({ row }) => (
        <DropdownMenu>
          <DropdownMenuTrigger asChild>
            <Button variant="ghost" className="h-8 w-8 p-0">
              <span className="sr-only">메뉴 열기</span>
              <FileX className="h-4 w-4" />
            </Button>
          </DropdownMenuTrigger>
          <DropdownMenuContent align="end">
            <DropdownMenuItem onClick={() => setRowAction({ row, type: "view" })}>
              <Eye className="mr-2 h-4 w-4" />
              상세보기
            </DropdownMenuItem>
            <DropdownMenuItem onClick={() => setRowAction({ row, type: "history" })}>
              <Calendar className="mr-2 h-4 w-4" />
              이력보기
            </DropdownMenuItem>
            <DropdownMenuSeparator />
            <DropdownMenuItem onClick={() => setRowAction({ row, type: "rebid" })}>
              <RefreshCw className="mr-2 h-4 w-4" />
              재입찰
            </DropdownMenuItem>
          </DropdownMenuContent>
        </DropdownMenu>
      ),
      size: 50,
      enableSorting: false,
      enableHiding: false,
    },
  ]
}
