import React from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
import { List as ImmutableList } from 'immutable'
import { makeGetNotification } from '../selectors'
import Notification from '../components/notification'

const getAccountFromState = (state, accountId) => {
  return state.getIn(['accounts', accountId])
}

const makeMapStateToProps = () => {
  const getNotification = makeGetNotification()

  const mapStateToProps = (state, props) => {
    const isFollows = !!props.notification.get('follow')
    const isLikes = !!props.notification.get('like')
    const isReposts = !!props.notification.get('repost')
    const isGrouped = isFollows || isLikes || isReposts
    const lastReadId = state.getIn(['notifications', 'lastReadId'])
    const isDeckConnected = state.getIn(['deck', 'connected'], false)

    if (isFollows) {
      let lastUpdated
      let isUnread

      const list = props.notification.get('follow')
      let accounts = ImmutableList()
      list.forEach((item) => {
        const account = getAccountFromState(state, item.get('account'))
        accounts = accounts.set(accounts.size, account)
        if (!lastUpdated) {
          isUnread = parseInt(item.get('id')) > parseInt(lastReadId)
          lastUpdated = item.get('created_at')
        }
      })
  
      return {
        type: 'follow',
        accounts: accounts,
        createdAt: lastUpdated,
        isUnread: isUnread,
        statusId: undefined,
        isDeckConnected,
      }
    } else if (isLikes || isReposts) {
      const theType = isLikes ? 'like' : 'repost'
      const list = props.notification.get(theType)
      let lastUpdated = list.get('lastUpdated')
      let isUnread = list.get('isUnread')

      let accounts = ImmutableList()
      const accountIdArr = list.get('accounts')

      for (let i = 0; i < accountIdArr.length; i++) {
        const accountId = accountIdArr[i];
        const account = getAccountFromState(state, accountId)
        accounts = accounts.set(accounts.size, account)
      }

      return {
        type: theType,
        accounts: accounts,
        createdAt: lastUpdated,
        isUnread: isUnread,
        status: state.getIn(['statuses', list.get('status')], null),
        isDeckConnected,
      }
    } else if (!isGrouped) {
      const notification = getNotification(state, props.notification, props.notification.get('account'))
      const account = notification.get('account')
      const statusId = notification.get('status')

      return {
        type: notification.get('type'),
        accounts: !!account ? ImmutableList([account]) : ImmutableList(),
        createdAt: notification.get('created_at'),
        isUnread: lastReadId < notification.get('id'),
        status: state.getIn(['statuses', statusId], null),
        isDeckConnected,
      }
    }
  }

  return mapStateToProps
}

export default connect(makeMapStateToProps)(Notification)
