import { useCallback, useEffect, useState } from 'react'
import { Tag, message } from 'antd'
import { groupBy } from 'lodash-es'
import { useModel, history } from 'umi'
import NoticeIcon from './NoticeIcon'
import styles from './index.less'
import dayjs from 'dayjs'
import { queryNoticeList, updateNotice } from '@/services/login'
import consts from '@/consts'
import { useModal } from '@/components/ModalStore'

export type GlobalHeaderRightProps = {
  fetchingNotices?: boolean
  onNoticeVisibleChange?: (visible: boolean) => void
  onNoticeClear?: (tabName?: string) => void
}

const getNoticeData = notices => {
  if (!notices || notices.length === 0 || !Array.isArray(notices)) {
    return {}
  }

  const newNotices = notices.map(notice => {
    const newNotice = { ...notice }

    if (newNotice.datetime) {
      newNotice.createTime = dayjs(notice.datetime as string).diff(dayjs(), 'date')
    }

    if (newNotice.id) {
      newNotice.key = newNotice.id
    }

    if (newNotice.extra && newNotice.status) {
      const color = {
        todo: '',
        processing: 'blue',
        urgent: 'red',
        doing: 'gold'
      }[newNotice.status]
      newNotice.extra = (
        <Tag
          color={color}
          style={{
            marginRight: 0
          }}
        >
          {newNotice.extra}
        </Tag>
      ) as any
    }

    return newNotice
  })
  return groupBy(newNotices, 'msgType')
}

const getUnreadData = (noticeData: Record<string, API.NoticeIconItem[]>) => {
  const unreadMsg: Record<string, number> = {}
  Object.keys(noticeData).forEach(key => {
    const value = noticeData[key]

    if (!unreadMsg[key]) {
      unreadMsg[key] = 0
    }

    if (Array.isArray(value)) {
      unreadMsg[key] = value.filter(item => !item.read).length
    }
  })
  return unreadMsg
}

const NoticeIconView = () => {
  const { initialState, setInitialState } = useModel('@@initialState')
  const { currentUser } = initialState || {}
  const [notices, setNotices] = useState([])
  const dispatchModal = useModal()
  const getNotices = useCallback(async () => {
    const { code = -1, data } = await queryNoticeList({ current: 1, pageSize: 50 })
    if (code === consts.RET_CODE.SUCCESS) {
      setNotices(data.message)
    }
  }, [])
  useEffect(() => {
    getNotices()
  }, [])

  const noticeData = getNoticeData(notices)
  const unreadMsg = getUnreadData(noticeData || {})

  const changeReadState = async item => {
    if (item.isRead) return
    const { code = -1 } = await updateNotice({ ids: [item.id] })
    if (code === consts.RET_CODE.SUCCESS) {
      setNotices(
        notices.map(i => {
          const notice = { ...i }
          if (notice.id === item.id) {
            notice.isRead = true
          }
          return notice
        })
      )
      setInitialState({
        ...initialState,
        currentUser: { ...currentUser, unreadCount: currentUser.unreadCount - 1 }
      })
    }
    dispatchModal('D_NOTICE_DETAIL', { item })
  }

  const clearReadState = async (title: string, key: string) => {
    if (initialState?.currentUser?.[`${title}HasClear`]) return

    const ids = []
    setNotices(
      notices.map(item => {
        const notice = { ...item }
        if (notice.msgType === key) {
          notice.isRead = true
          ids.push(item.id)
        }
        return notice
      })
    )
    const { code = -1 } = await updateNotice({ ids })
    if (code === consts.RET_CODE.SUCCESS) {
      message.success(`${'清空了'} ${title}`)
      setInitialState({
        ...initialState,
        currentUser: {
          ...currentUser,
          unreadCount: currentUser.unreadCount - ids.length,
          [`${title}HasClear`]: true
        }
      })
    }
  }

  return (
    <NoticeIcon
      className={styles.action}
      count={currentUser && currentUser.unreadCount}
      onItemClick={item => {
        changeReadState(item)
      }}
      onClear={(title: string, key: string) => clearReadState(title, key)}
      loading={false}
      clearText="清空"
      viewMoreText="查看更多"
      onViewMore={() => history.push('/hr/notification')}
      clearClose
    >
      <NoticeIcon.Tab
        tabKey="notification"
        count={unreadMsg.notification}
        list={noticeData.notification}
        title="通知"
        emptyText="你已查看所有通知"
        showViewMore
      />
      {/* <NoticeIcon.Tab
        tabKey="message"
        count={unreadMsg.message}
        list={noticeData.message}
        title="消息"
        emptyText="您已读完所有消息"
        showViewMore
      />
      <NoticeIcon.Tab
        tabKey="event"
        title="待办"
        emptyText="你已完成所有待办"
        count={unreadMsg.event}
        list={noticeData.event}
        showViewMore
      /> */}
    </NoticeIcon>
  )
}

export default NoticeIconView
