import { connect } from 'react-redux'
import { clearConfirmTransaction } from '../../../ducks/confirm-transaction/confirm-transaction.duck'
import { accountsWithSendEtherInfoSelector } from '../../../selectors'
import { getAccountByAddress } from '../../../helpers/utils/util'
import { MESSAGE_TYPE } from '../../../../../app/scripts/lib/enums'
import SignatureRequest from './signature-request.component'

function mapStateToProps(state) {
  return {
    // not forwarded to component
    allAccounts: accountsWithSendEtherInfoSelector(state),
  }
}

function mapDispatchToProps(dispatch) {
  return {
    clearConfirmTransaction: () => dispatch(clearConfirmTransaction()),
  }
}

function mergeProps(stateProps, dispatchProps, ownProps) {
  const { allAccounts } = stateProps
  const {
    signPersonalMessage,
    signTypedMessage,
    cancelPersonalMessage,
    cancelTypedMessage,
    signMessage,
    cancelMessage,
    txData,
  } = ownProps

  const {
    type,
    msgParams: { from },
  } = txData

  const fromAccount = getAccountByAddress(allAccounts, from)

  let cancel
  let sign

  if (type === MESSAGE_TYPE.PERSONAL_SIGN) {
    cancel = cancelPersonalMessage
    sign = signPersonalMessage
  } else if (type === MESSAGE_TYPE.ETH_SIGN_TYPED_DATA) {
    cancel = cancelTypedMessage
    sign = signTypedMessage
  } else if (type === MESSAGE_TYPE.ETH_SIGN) {
    cancel = cancelMessage
    sign = signMessage
  }

  return {
    ...ownProps,
    ...dispatchProps,
    fromAccount,
    txData,
    cancel,
    sign,
  }
}

export default connect(
  mapStateToProps,
  mapDispatchToProps,
  mergeProps,
)(SignatureRequest)
