/*
Copyright (C) 2023-2026 QuantumNous

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.

For commercial licensing, please contact support@quantumnous.com
*/
import { Handle, Position } from '@xyflow/react'
import type { ComponentProps } from 'react'

import {
  Card,
  CardAction,
  CardContent,
  CardDescription,
  CardFooter,
  CardHeader,
  CardTitle,
} from '@/components/ui/card'
import { cn } from '@/lib/utils'

export type NodeProps = ComponentProps<typeof Card> & {
  handles: {
    target: boolean
    source: boolean
  }
}

export const Node = ({ handles, className, ...props }: NodeProps) => (
  <Card
    className={cn(
      'node-container relative size-full h-auto w-sm gap-0 rounded-md p-0',
      className
    )}
    {...props}
  >
    {handles.target && <Handle position={Position.Left} type='target' />}
    {handles.source && <Handle position={Position.Right} type='source' />}
    {props.children}
  </Card>
)

export type NodeHeaderProps = ComponentProps<typeof CardHeader>

export const NodeHeader = ({ className, ...props }: NodeHeaderProps) => (
  <CardHeader
    className={cn('bg-secondary gap-0.5 rounded-t-md border-b p-3!', className)}
    {...props}
  />
)

export type NodeTitleProps = ComponentProps<typeof CardTitle>

export const NodeTitle = (props: NodeTitleProps) => <CardTitle {...props} />

export type NodeDescriptionProps = ComponentProps<typeof CardDescription>

export const NodeDescription = (props: NodeDescriptionProps) => (
  <CardDescription {...props} />
)

export type NodeActionProps = ComponentProps<typeof CardAction>

export const NodeAction = (props: NodeActionProps) => <CardAction {...props} />

export type NodeContentProps = ComponentProps<typeof CardContent>

export const NodeContent = ({ className, ...props }: NodeContentProps) => (
  <CardContent className={cn('p-3', className)} {...props} />
)

export type NodeFooterProps = ComponentProps<typeof CardFooter>

export const NodeFooter = ({ className, ...props }: NodeFooterProps) => (
  <CardFooter
    className={cn('bg-secondary rounded-b-md border-t p-3!', className)}
    {...props}
  />
)
