/*
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
*/
'use client'

import { ChevronDownIcon, PaperclipIcon } from 'lucide-react'
import type { ComponentProps } from 'react'

import { Button } from '@/components/ui/button'
import {
  Collapsible,
  CollapsibleContent,
  CollapsibleTrigger,
} from '@/components/ui/collapsible'
import { ScrollArea } from '@/components/ui/scroll-area'
import { cn } from '@/lib/utils'

export type QueueMessagePart = {
  type: string
  text?: string
  url?: string
  filename?: string
  mediaType?: string
}

export type QueueMessage = {
  id: string
  parts: QueueMessagePart[]
}

export type QueueTodo = {
  id: string
  title: string
  description?: string
  status?: 'pending' | 'completed'
}

export type QueueItemProps = ComponentProps<'li'>

export const QueueItem = ({ className, ...props }: QueueItemProps) => (
  <li
    className={cn(
      'group hover:bg-muted flex flex-col gap-1 rounded-md px-3 py-1 text-sm transition-colors',
      className
    )}
    {...props}
  />
)

export type QueueItemIndicatorProps = ComponentProps<'span'> & {
  completed?: boolean
}

export const QueueItemIndicator = ({
  completed = false,
  className,
  ...props
}: QueueItemIndicatorProps) => (
  <span
    className={cn(
      'mt-0.5 inline-block size-2.5 rounded-full border',
      completed
        ? 'border-muted-foreground/20 bg-muted-foreground/10'
        : 'border-muted-foreground/50',
      className
    )}
    {...props}
  />
)

export type QueueItemContentProps = ComponentProps<'span'> & {
  completed?: boolean
}

export const QueueItemContent = ({
  completed = false,
  className,
  ...props
}: QueueItemContentProps) => (
  <span
    className={cn(
      'line-clamp-1 grow break-words',
      completed
        ? 'text-muted-foreground/50 line-through'
        : 'text-muted-foreground',
      className
    )}
    {...props}
  />
)

export type QueueItemDescriptionProps = ComponentProps<'div'> & {
  completed?: boolean
}

export const QueueItemDescription = ({
  completed = false,
  className,
  ...props
}: QueueItemDescriptionProps) => (
  <div
    className={cn(
      'ml-6 text-xs',
      completed
        ? 'text-muted-foreground/40 line-through'
        : 'text-muted-foreground',
      className
    )}
    {...props}
  />
)

export type QueueItemActionsProps = ComponentProps<'div'>

export const QueueItemActions = ({
  className,
  ...props
}: QueueItemActionsProps) => (
  <div className={cn('flex gap-1', className)} {...props} />
)

export type QueueItemActionProps = Omit<
  ComponentProps<typeof Button>,
  'variant' | 'size'
>

export const QueueItemAction = ({
  className,
  ...props
}: QueueItemActionProps) => (
  <Button
    className={cn(
      'text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground size-auto rounded p-1 opacity-0 transition-opacity group-hover:opacity-100',
      className
    )}
    size='icon'
    type='button'
    variant='ghost'
    {...props}
  />
)

export type QueueItemAttachmentProps = ComponentProps<'div'>

export const QueueItemAttachment = ({
  className,
  ...props
}: QueueItemAttachmentProps) => (
  <div className={cn('mt-1 flex flex-wrap gap-2', className)} {...props} />
)

export type QueueItemImageProps = ComponentProps<'img'>

export const QueueItemImage = ({
  className,
  ...props
}: QueueItemImageProps) => (
  <img
    alt=''
    className={cn('h-8 w-8 rounded border object-cover', className)}
    height={32}
    width={32}
    {...props}
  />
)

export type QueueItemFileProps = ComponentProps<'span'>

export const QueueItemFile = ({
  children,
  className,
  ...props
}: QueueItemFileProps) => (
  <span
    className={cn(
      'bg-muted flex items-center gap-1 rounded border px-2 py-1 text-xs',
      className
    )}
    {...props}
  >
    <PaperclipIcon size={12} />
    <span className='max-w-[100px] truncate'>{children}</span>
  </span>
)

export type QueueListProps = ComponentProps<typeof ScrollArea>

export const QueueList = ({
  children,
  className,
  ...props
}: QueueListProps) => (
  <ScrollArea className={cn('mt-2 -mb-1', className)} {...props}>
    <div className='max-h-40 pr-4'>
      <ul>{children}</ul>
    </div>
  </ScrollArea>
)

// QueueSection - collapsible section container
export type QueueSectionProps = ComponentProps<typeof Collapsible>

export const QueueSection = ({
  className,
  defaultOpen = true,
  ...props
}: QueueSectionProps) => (
  <Collapsible className={cn(className)} defaultOpen={defaultOpen} {...props} />
)

// QueueSectionTrigger - section header/trigger
export type QueueSectionTriggerProps = ComponentProps<'button'>

export const QueueSectionTrigger = ({
  children,
  className,
  ...props
}: QueueSectionTriggerProps) => (
  <CollapsibleTrigger
    render={
      <Button
        variant='ghost'
        className={cn(
          'group bg-muted/40 text-muted-foreground hover:bg-muted h-auto w-full justify-between px-3 py-2 text-left',
          className
        )}
        type='button'
        {...props}
      />
    }
  >
    {children}
  </CollapsibleTrigger>
)

// QueueSectionLabel - label content with icon and count
export type QueueSectionLabelProps = ComponentProps<'span'> & {
  count?: number
  label: string
  icon?: React.ReactNode
}

export const QueueSectionLabel = ({
  count,
  label,
  icon,
  className,
  ...props
}: QueueSectionLabelProps) => (
  <span className={cn('flex items-center gap-2', className)} {...props}>
    <ChevronDownIcon className='size-4 -rotate-90 transition-transform group-data-[panel-open]:rotate-0' />
    {icon}
    <span>
      {count} {label}
    </span>
  </span>
)

// QueueSectionContent - collapsible content area
export type QueueSectionContentProps = ComponentProps<typeof CollapsibleContent>

export const QueueSectionContent = ({
  className,
  ...props
}: QueueSectionContentProps) => (
  <CollapsibleContent className={cn(className)} {...props} />
)

export type QueueProps = ComponentProps<'div'>

export const Queue = ({ className, ...props }: QueueProps) => (
  <div
    className={cn(
      'border-border bg-background flex flex-col gap-2 rounded-xl border px-3 pt-2 pb-2 shadow-xs',
      className
    )}
    {...props}
  />
)
