import type { ColumnDef, Row } from "@tanstack/react-table";
import { ClientDataTableColumnHeaderSimple } from "../client-data-table/data-table-column-simple-header";
import { Button } from "@/components/ui/button";
import { Checkbox } from "@/components/ui/checkbox";
import { Badge } from "@/components/ui/badge"; // Badge import 추가
import { Ellipsis } from "lucide-react";
import { formatDate } from "@/lib/utils";
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuRadioGroup,
  DropdownMenuRadioItem,
  DropdownMenuSeparator,
  DropdownMenuShortcut,
  DropdownMenuSub,
  DropdownMenuSubContent,
  DropdownMenuSubTrigger,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
import { toast } from 'sonner';

/** row 액션 관련 타입 */
export interface DataTableRowAction<TData> {
  row: Row<TData>;
  type: "open" | "edit" | "update" | "delete";
}

/** 컬럼 타입 (필요에 따라 확장) */
export type ColumnType = "STRING" | "NUMBER" | "LIST";

export interface DataTableColumnJSON {
  key: string;
  /** 실제 Excel 등에서 구분용으로 쓰이는 label (고정) */
  label: string;

  /** UI 표시용 label (예: 단위를 함께 표시) */
  displayLabel?: string;

  type: ColumnType;
  options?: string[];
  uom?: string;
  uomId?: string;
  shi?: boolean;
  
  /** 템플릿에서 가져온 추가 정보 */
  hidden?: boolean;  // true이면 컬럼 숨김
  seq?: number;      // 정렬 순서
  head?: string;     // 헤더 텍스트 (우선순위 가장 높음)
}

/**
 * getColumns 함수에 필요한 props
 * - TData: 테이블에 표시할 행(Row)의 타입
 */
interface GetColumnsProps<TData> {
  columnsJSON: DataTableColumnJSON[];
  setRowAction: React.Dispatch<
    React.SetStateAction<DataTableRowAction<TData> | null>
  >;
  setReportData: React.Dispatch<React.SetStateAction<{ [key: string]: any }[]>>;
  tempCount: number;
  // 체크박스 선택 관련 props
  selectedRows?: Record<string, boolean>;
  onRowSelectionChange?: (updater: Record<string, boolean> | ((prev: Record<string, boolean>) => Record<string, boolean>)) => void;
  // editableFieldsMap 제거됨
}

/**
 * status 값에 따라 Badge variant를 결정하는 헬퍼 함수
 */
function getStatusBadgeVariant(status: string): "default" | "secondary" | "destructive" | "outline" {
  const statusStr = String(status).toLowerCase();
  
  switch (statusStr) {
    case 'NEW':
    case 'New':
    // case 'approved':
      return 'default'; // 초록색 계열
    case 'Updated or Modified':
    // case 'in progress':
    // case 'processing':
      return 'secondary'; // 노란색 계열
    case 'inactive':
    case 'rejected':
    case 'failed':
    case 'cancelled':
      return 'destructive'; // 빨간색 계열
    default:
      return 'outline'; // 기본 회색 계열
  }
}

/**
 * 헤더 텍스트를 결정하는 헬퍼 함수
 * displayLabel이 있으면 사용, 없으면 label 사용
 */
function getHeaderText(col: DataTableColumnJSON): string {
  if (col.displayLabel && col.displayLabel.trim()) {
    return col.displayLabel;
  }
  return col.label;
}

/**
 * 컬럼들을 head 값에 따라 그룹핑하는 헬퍼 함수
 */
function groupColumnsByHead(columns: DataTableColumnJSON[]): ColumnDef<any>[] {
  const groupedColumns: ColumnDef<any>[] = [];
  const groupMap = new Map<string, DataTableColumnJSON[]>();
  const ungroupedColumns: DataTableColumnJSON[] = [];

  // head 값에 따라 컬럼들을 그룹핑
  columns.forEach(col => {
    if (col.head && col.head.trim()) {
      const groupKey = col.head.trim();
      if (!groupMap.has(groupKey)) {
        groupMap.set(groupKey, []);
      }
      groupMap.get(groupKey)!.push(col);
    } else {
      ungroupedColumns.push(col);
    }
  });

  // 그룹핑된 컬럼들 처리
  groupMap.forEach((groupColumns, groupHeader) => {
    if (groupColumns.length === 1) {
      // 그룹에 컬럼이 하나만 있으면 일반 컬럼으로 처리
      ungroupedColumns.push(groupColumns[0]);
    } else {
      // 그룹 컬럼 생성
      const groupColumn: ColumnDef<any> = {
        header: groupHeader,
        columns: groupColumns.map(col => createColumnDef(col))
      };
      groupedColumns.push(groupColumn);
    }
  });

  // 그룹핑되지 않은 컬럼들 처리
  ungroupedColumns.forEach(col => {
    groupedColumns.push(createColumnDef(col));
  });

  return groupedColumns;
}

/**
 * 개별 컬럼 정의를 생성하는 헬퍼 함수
 */
function createColumnDef(col: DataTableColumnJSON): ColumnDef<any> {
  return {
    accessorKey: col.key,
    header: ({ column }) => (
      <ClientDataTableColumnHeaderSimple
        column={column}
        title={getHeaderText(col)}
      />
    ),

    meta: {
      excelHeader: col.label,
      minWidth: 80,
      paddingFactor: 1.2,
      maxWidth: col.key === "TAG_NO" ? 120 : 150,
      isReadOnly: col.shi === true,
    },
    
    cell: ({ row }) => {
      const cellValue = row.getValue(col.key);
      
      // SHI 필드만 읽기 전용으로 처리
      const isReadOnly = col.shi === true;
      
      const readOnlyClass = isReadOnly ? "read-only-cell" : "";
      const cellStyle = isReadOnly 
        ? { backgroundColor: '#f5f5f5', color: '#666', cursor: 'not-allowed' } 
        : {};

      // 툴팁 메시지 설정 (SHI 필드만)
      const tooltipMessage = isReadOnly ? "SHI 전용 필드입니다" : "";

      // status 컬럼인 경우 Badge 적용
      if (col.key === "status") {
        const statusValue = String(cellValue ?? "");
        const badgeVariant = getStatusBadgeVariant(statusValue);
        
        return (
          <div 
            className={readOnlyClass} 
            style={cellStyle}
            title={tooltipMessage}
          >
            <Badge variant={badgeVariant}>
              {statusValue}
            </Badge>
          </div>
        );
      }

      // 데이터 타입별 처리
      switch (col.type) {
        case "NUMBER":
          return (
            <div 
              className={readOnlyClass} 
              style={cellStyle} 
              title={tooltipMessage}
            >
              {cellValue ? Number(cellValue).toLocaleString() : ""}
            </div>
          );

        case "LIST":
          return (
            <div 
              className={readOnlyClass} 
              style={cellStyle}
              title={tooltipMessage}
            >
              {String(cellValue ?? "")}
            </div>
          );

        case "STRING":
        default:
          return (
            <div 
              className={readOnlyClass} 
              style={cellStyle}
              title={tooltipMessage}
            >
              {String(cellValue ?? "")}
            </div>
          );
      }
    },
  };
}

/**
 * getColumns 함수
 * 1) columnsJSON 배열을 필터링 (hidden이 true가 아닌 것들만)
 * 2) seq에 따라 정렬
 * 3) head 값에 따라 컬럼 그룹핑
 * 4) 체크박스 컬럼 추가
 * 5) 마지막에 "Action" 칼럼 추가
 */
export function getColumns<TData extends object>({
  columnsJSON,
  setRowAction,
  setReportData,
  tempCount,
  selectedRows = {},
  onRowSelectionChange,
  // editableFieldsMap 매개변수 제거됨
}: GetColumnsProps<TData>): ColumnDef<TData>[] {
  const columns: ColumnDef<TData>[] = [];

  // (0) 컬럼 필터링 및 정렬
  const visibleColumns = columnsJSON
    .filter(col => col.hidden !== true) // hidden이 true가 아닌 것들만
    .sort((a, b) => {
      // seq가 없는 경우 999999로 처리하여 맨 뒤로 보냄
      const seqA = a.seq !== undefined ? a.seq : 999999;
      const seqB = b.seq !== undefined ? b.seq : 999999;
      return seqA - seqB;
    });

  // (1) 체크박스 컬럼 (항상 표시)
  const selectColumn: ColumnDef<TData> = {
    id: "select",
    header: ({ table }) => (
      <Checkbox
        checked={
          table.getIsAllPageRowsSelected() ||
          (table.getIsSomePageRowsSelected() && "indeterminate")
        }
        onCheckedChange={(value) => {
          table.toggleAllPageRowsSelected(!!value);
          
          // 모든 행 선택/해제
          if (onRowSelectionChange) {
            const allRowsSelection: Record<string, boolean> = {};
            table.getRowModel().rows.forEach((row) => {
              allRowsSelection[row.id] = !!value;
            });
            onRowSelectionChange(allRowsSelection);
          }
        }}
        aria-label="Select all"
        className="translate-y-[2px]"
      />
    ),
    cell: ({ row }) => (
      <Checkbox
        checked={row.getIsSelected()}
        onCheckedChange={(value) => {
          row.toggleSelected(!!value);
          
          // 개별 행 선택 상태 업데이트
          if (onRowSelectionChange) {
            onRowSelectionChange(prev => ({
              ...prev,
              [row.id]: !!value
            }));
          }
        }}
        aria-label="Select row"
        className="translate-y-[2px]"
      />
    ),
    enableSorting: false,
    enableHiding: false,
    enablePinning: true,
    size: 40,
  };
  columns.push(selectColumn);

  // (2) 기본 컬럼들 (head에 따라 그룹핑 처리)
  const groupedColumns = groupColumnsByHead(visibleColumns);
  columns.push(...groupedColumns);
  
  // (3) 액션 칼럼 - update 버튼 예시
  const actionColumn: ColumnDef<TData> = {
    id: "update",
    header: "",
    cell: ({ row }) => (
      <DropdownMenu>
        <DropdownMenuTrigger asChild>
          <Button
            aria-label="Open menu"
            variant="ghost"
            className="flex size-8 p-0 data-[state=open]:bg-muted"
          >
            <Ellipsis className="size-4" aria-hidden="true" />
          </Button>
        </DropdownMenuTrigger>
        <DropdownMenuContent align="end" className="w-40">
          <DropdownMenuItem
            onSelect={() => {
              setRowAction({ row, type: "update" });
            }}
          >
            Edit
          </DropdownMenuItem>
          <DropdownMenuItem
            onSelect={() => {
              if(tempCount > 0){
                const { original } = row;
                setReportData([original]);
              } else {
                toast.error("업로드된 Template File이 없습니다.");
              }
            }}
          >
            Create Document
          </DropdownMenuItem>
          <DropdownMenuSeparator />
          <DropdownMenuItem
            onSelect={() => {
              setRowAction({ row, type: "delete" });
            }}
            className="text-red-600 focus:text-red-600"
          >
            Delete
          </DropdownMenuItem>
        </DropdownMenuContent>
      </DropdownMenu>
    ),
    size: 40,
    enablePinning: true,
  };

  columns.push(actionColumn);

  // (4) 최종 반환
  return columns;
}