import { Contract } from 'common/contract'
import { Group } from 'common/group'
import { Post } from 'common/post'
import { useState } from 'react'
import { Button } from './button'
import { PillButton } from './buttons/pill-button'
import { ContractSearch } from './contract-search'
import { Col } from './layout/col'
import { Modal } from './layout/modal'
import { Row } from './layout/row'
import { LoadingIndicator } from './loading-indicator'
import { PostCardList } from './post-card'

export function PinnedSelectModal(props: {
  title: string
  description?: React.ReactNode
  open: boolean
  setOpen: (open: boolean) => void
  onSubmit: (
    selectedItems: { itemId: string; type: string }[]
  ) => void | Promise<void>
  contractSearchOptions?: Partial<Parameters<typeof ContractSearch>[0]>
  posts: Post[]
  group?: Group
}) {
  const {
    title,
    description,
    open,
    setOpen,
    onSubmit,
    contractSearchOptions,
    posts,
    group,
  } = props

  const [selectedItem, setSelectedItem] = useState<{
    itemId: string
    type: string
  } | null>(null)
  const [loading, setLoading] = useState(false)
  const [selectedTab, setSelectedTab] = useState<'contracts' | 'posts'>('posts')

  async function selectContract(contract: Contract) {
    selectItem(contract.id, 'contract')
  }

  async function selectPost(post: Post) {
    selectItem(post.id, 'post')
  }

  async function selectItem(itemId: string, type: string) {
    setSelectedItem({ itemId: itemId, type: type })
  }

  async function onFinish() {
    setLoading(true)
    if (selectedItem) {
      await onSubmit([
        {
          itemId: selectedItem.itemId,
          type: selectedItem.type,
        },
      ])
      setLoading(false)
      setOpen(false)
      setSelectedItem(null)
    }
  }

  return (
    <Modal open={open} setOpen={setOpen} className={' sm:p-0'} size={'lg'}>
      <Col className=" h-[85vh] w-full gap-4 overflow-scroll rounded-md bg-white">
        <div className=" p-8 pb-0">
          <Row>
            <div className={'text-xl text-indigo-700'}>{title}</div>

            {!loading && (
              <Row className="grow justify-end gap-4">
                {selectedItem && (
                  <Button onClick={onFinish} color="indigo">
                    Add to Pinned
                  </Button>
                )}
                <Button
                  onClick={() => {
                    setSelectedItem(null)
                    setOpen(false)
                  }}
                  color="gray"
                >
                  Cancel
                </Button>
              </Row>
            )}
          </Row>
          {description}
        </div>

        {loading && (
          <div className="w-full justify-center">
            <LoadingIndicator />
          </div>
        )}
        <div>
          <Row className="justify-center gap-4">
            <PillButton
              onSelect={() => setSelectedTab('contracts')}
              selected={selectedTab === 'contracts'}
            >
              Contracts
            </PillButton>
            <PillButton
              onSelect={() => setSelectedTab('posts')}
              selected={selectedTab === 'posts'}
            >
              Posts
            </PillButton>
          </Row>
        </div>

        {selectedTab === 'contracts' ? (
          <div className="overflow-y-auto px-2 sm:px-8">
            <ContractSearch
              hideOrderSelector
              onContractClick={selectContract}
              cardUIOptions={{
                hideGroupLink: true,
                hideQuickBet: true,
                noLinkAvatar: true,
              }}
              highlightOptions={{
                itemIds: [selectedItem?.itemId ?? ''],
                highlightClassName:
                  '!bg-indigo-100 outline outline-2 outline-indigo-300',
              }}
              additionalFilter={group ? { groupSlug: group.slug } : undefined}
              persistPrefix={group ? `group-${group.slug}` : undefined}
              headerClassName="bg-white sticky"
              {...contractSearchOptions}
            />
          </div>
        ) : (
          <>
            <div className="mt-2 px-2">
              <PostCardList
                posts={posts}
                onPostClick={selectPost}
                highlightOptions={{
                  itemIds: [selectedItem?.itemId ?? ''],
                  highlightClassName:
                    '!bg-indigo-100 outline outline-2 outline-indigo-300',
                }}
              />
              {posts.length == 0 && (
                <div className="text-center text-gray-500">No posts yet</div>
              )}
            </div>
          </>
        )}
      </Col>
    </Modal>
  )
}