'use client'
import type { FC } from 'react'
import { Avatar } from '@langgenius/dify-ui/avatar'
import { Popover, PopoverContent, PopoverTrigger } from '@langgenius/dify-ui/popover'
import * as React from 'react'
import { useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import Input from '@/app/components/base/input'
import { useMembers } from '@/service/use-common'

type Props = Readonly<{
  value?: string
  onSelect: (value: string) => void
  exclude?: string[]
}>

const MemberSelector: FC<Props> = ({ value, onSelect, exclude = [] }) => {
  const { t } = useTranslation()
  const [open, setOpen] = useState(false)
  const [searchValue, setSearchValue] = useState('')

  const { data } = useMembers()

  const currentValue = useMemo(() => {
    if (!data?.accounts || !value) return null
    return data.accounts.find((account) => account.id === value) ?? null
  }, [data, value])

  const filteredList = useMemo(() => {
    if (!data?.accounts) return []
    const accounts = data.accounts
    if (!searchValue) return accounts.filter((account) => !exclude.includes(account.id))
    return accounts
      .filter((account) => {
        const name = account.name || ''
        const email = account.email || ''
        return (
          name.toLowerCase().includes(searchValue.toLowerCase()) ||
          email.toLowerCase().includes(searchValue.toLowerCase())
        )
      })
      .filter((account) => !exclude.includes(account.id))
  }, [data, exclude, searchValue])

  return (
    <Popover open={open} onOpenChange={setOpen}>
      <PopoverTrigger
        render={
          <div
            data-testid="member-selector-trigger"
            className="group flex cursor-pointer items-center gap-1.5 rounded-lg bg-components-input-bg-normal px-2 py-1 hover:bg-state-base-hover-alt data-popup-open:bg-state-base-hover-alt"
          >
            {!currentValue && (
              <div className="grow p-1 system-sm-regular text-components-input-text-placeholder">
                {t(($) => $['members.transferModal.transferPlaceholder'], { ns: 'common' })}
              </div>
            )}
            {currentValue && (
              <>
                <Avatar avatar={currentValue.avatar_url} size="sm" name={currentValue.name} />
                <div className="grow truncate system-sm-medium text-text-secondary">
                  {currentValue.name}
                </div>
                <div className="system-xs-regular text-text-quaternary">{currentValue.email}</div>
              </>
            )}
            <div className="i-ri-arrow-down-s-line size-4 text-text-quaternary group-hover:text-text-secondary group-data-popup-open:text-text-secondary" />
          </div>
        }
      />
      <PopoverContent
        placement="bottom"
        sideOffset={4}
        popupClassName="border-none bg-transparent p-0 shadow-none backdrop-blur-none"
      >
        <div className="min-w-[372px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-xs">
          <div className="p-2 pb-1">
            <Input
              showLeftIcon
              aria-label={t(($) => $['operation.search'], { ns: 'common' })}
              value={searchValue}
              onChange={(e) => setSearchValue(e.target.value)}
            />
          </div>
          <div className="p-1">
            {filteredList.map((account) => (
              <div
                key={account.id}
                data-testid="member-selector-item"
                className="flex cursor-pointer items-center gap-2 rounded-lg py-1 pr-3 pl-2 hover:bg-state-base-hover"
                onClick={() => {
                  onSelect(account.id)
                  setOpen(false)
                }}
              >
                <Avatar avatar={account.avatar_url} size="sm" name={account.name} />
                <div className="grow truncate system-sm-medium text-text-secondary">
                  {account.name}
                </div>
                <div className="system-xs-regular text-text-quaternary">{account.email}</div>
              </div>
            ))}
          </div>
        </div>
      </PopoverContent>
    </Popover>
  )
}

export default MemberSelector
