import type { TemplateResult } from 'lit'

import type {
  IFileItem,
  IFileTransfer,
  IFileValidateDetail,
  IFilesChangedDetail,
  ITransferCancelledDetail,
  TFilesChangedReason,
  TFileUploadItemRenderer,
  TFileValidator,
  TFileUploadStrategy,
  TTransferProgress,
} from 'shared-types'

export type TUploadStrategy = TFileUploadStrategy
export type { TFileUploadItemRenderer, TFilesChangedReason, TFileValidator, TTransferProgress }
export type TFileValidateDetail = IFileValidateDetail
export type TFileTransfer = IFileTransfer
export type TTransferCancelledDetail = ITransferCancelledDetail
export type TFilesChangedDetail = IFilesChangedDetail
export type FileItem = IFileItem

export type TFileComment = {
  text: string
  timestamp: string
}

export type TQueueOperationLabel = string | ((file: FileItem) => string)

export type TQueueOperationContext = {
  file: FileItem
  inputName: string
  disabled: boolean
  isActive: boolean
  activate: () => void
  close: () => void
  getAttribute: <T>(name: string) => T | undefined
  setAttribute: (name: string, value: unknown) => void
}

export type TQueueItemOperation = {
  id: string
  title: TQueueOperationLabel
  ariaLabel?: TQueueOperationLabel
  onClick?: (context: TQueueOperationContext) => void
  renderInlineUI?: (context: TQueueOperationContext) => TemplateResult | null
  renderExtendedUI?: (context: TQueueOperationContext) => TemplateResult | null
  renderContent?: (context: TQueueOperationContext) => TemplateResult | null
  renderHidden?: (context: TQueueOperationContext) => TemplateResult | null
}

export interface IPktFileUpload {
  id?: string
  name?: string
  label?: string
  helptext?: string
  required?: boolean
  multiple?: boolean
  disabled?: boolean
  fullwidth?: boolean
  uploadStrategy?: TUploadStrategy
  itemRenderer?: TFileUploadItemRenderer
  accept?: string
  allowedFormats?: string[]
  formatErrorMessage?: string
  maxFileSize?: string | number
  sizeErrorMessage?: string
  onFileValidation?: TFileValidator
  /** External error state (combined with internal validation errors). */
  hasError?: boolean
  /** External error message shown under the component. */
  errorMessage?: string
  /** Show "Valgfritt" tag in input-wrapper. */
  optionalTag?: boolean
  /** Show "Må fylles ut" tag in input-wrapper. */
  requiredTag?: boolean
  /** Trailing characters to keep when truncating long filenames. */
  truncateTail?: number
  /** Transfer states keyed by `fileId` (custom strategy progress/error/cancel rendering). */
  transfers?: TFileTransfer[]
  addCommentsEnabled?: boolean
  renameFilesEnabled?: boolean
  extraOperations?: TQueueItemOperation[]
  enableImagePreview?: boolean
  value?: FileItem[]
  defaultValue?: FileItem[]
}
