/* eslint-disable eslint-comments/disable-enable-pair */
/* eslint-disable jsx-a11y/media-has-caption */
import type { ReactNode } from 'react'
import { useEffect, useMemo, useState } from 'react'
import { getAssetType } from 'utils/getAssetType'

export interface MetadataFormGroupProps {
  title: string
  subtitle: ReactNode
  relatedAsset?: File
  children?: ReactNode
}

export const MetadataFormGroup = (props: MetadataFormGroupProps) => {
  const { title, subtitle, relatedAsset, children } = props
  const [htmlContents, setHtmlContents] = useState<string>('')

  const videoPreview = useMemo(
    () => (
      <video
        controls
        id="video"
        onMouseEnter={(e) => e.currentTarget.play()}
        onMouseLeave={(e) => e.currentTarget.pause()}
        src={relatedAsset ? URL.createObjectURL(relatedAsset) : ''}
      />
    ),
    [relatedAsset],
  )

  const audioPreview = useMemo(
    () => (
      <audio
        controls
        id="audio"
        onMouseEnter={(e) => e.currentTarget.play()}
        onMouseLeave={(e) => e.currentTarget.pause()}
        src={relatedAsset ? URL.createObjectURL(relatedAsset) : ''}
      />
    ),
    [relatedAsset],
  )

  useEffect(() => {
    if (getAssetType(relatedAsset?.name as string) !== 'html') return
    const reader = new FileReader()
    reader.onload = (e) => {
      if (typeof e.target?.result === 'string') {
        setHtmlContents(e.target.result)
      }
    }
    reader.readAsText(new Blob([relatedAsset as File]))
  }, [relatedAsset])

  return (
    <div className="flex p-4 pt-0 space-x-4 w-full">
      <div className="flex flex-col w-1/3">
        <label className="flex flex-col space-y-1">
          <span className="font-bold">{title}</span>
          {subtitle && <span className="text-sm text-white/50">{subtitle}</span>}
          <div>
            {relatedAsset && (
              <div className="flex flex-row items-center mt-2 mr-4 border-2 border-dashed">
                {getAssetType(relatedAsset.name) === 'audio' && audioPreview}
                {getAssetType(relatedAsset.name) === 'video' && videoPreview}
                {getAssetType(relatedAsset.name) === 'image' && (
                  <img alt="preview" src={URL.createObjectURL(relatedAsset)} />
                )}
                {getAssetType(relatedAsset.name) === 'html' && (
                  <iframe allowFullScreen height="420px" srcDoc={htmlContents} title="Preview" width="100%" />
                )}
              </div>
            )}
          </div>
        </label>
      </div>
      <div className="space-y-4 w-2/3">{children}</div>
    </div>
  )
}
