<div class="account-profile-follow {{shown ? 'shown' : ''}}">
  <IconButton
    label="{{followLabel}}"
    href="{{followIcon}}"
    pressable="true"
    pressed="{{following}}"
    big="true"
    on:click="onFollowButtonClick(event)"
    animation="{{animateFollowButton && followButtonAnimation}}"
  />
</div>
<style>
  .account-profile-follow {
    grid-area: follow;
    align-self: flex-start;
    display: none;
  }
  .account-profile-follow.shown {
    display: block;
  }
</style>
<script>
  import IconButton from '../IconButton.html'
  import { FOLLOW_BUTTON_ANIMATION } from '../../_static/animations'
  import { store } from '../../_store/store'
  import { setAccountFollowed } from '../../_actions/follow'
  import { setAccountBlocked } from '../../_actions/block'

  export default {
    methods: {
      async onFollowButtonClick(e) {
        e.preventDefault()
        e.stopPropagation()
        let account = this.get('account')
        let accountId = this.get('accountId')
        let following = this.get('following')
        let followRequested = this.get('followRequested')
        let blocking = this.get('blocking')
        this.set({animateFollowButton: true}) // TODO: this should be an event, not toggling a boolean
        if (blocking) { // unblock
          await setAccountBlocked(accountId, false)
        } else { // follow/unfollow
          let newFollowingValue = !(following || followRequested)
          if (!account.locked) { // be optimistic, show the user that it succeeded
            this.set({overrideFollowing: newFollowingValue})
          }
          await setAccountFollowed(accountId, newFollowingValue)
        }

        this.set({animateFollowButton: false}) // let animation play next time
      }
    },
    store: () => store,
    data: () => ({
      followButtonAnimation: FOLLOW_BUTTON_ANIMATION
    }),
    computed: {
      accountId: (account) => account.id,
      following: (relationship, overrideFollowing) => {
        if (typeof overrideFollowing === 'boolean') {
          return overrideFollowing
        }
        return relationship && relationship.following
      },
      blocking: (relationship) => relationship && relationship.blocking,
      followRequested: (relationship, account) => {
        return relationship && relationship.requested && account && account.locked
      },
      followLabel: (blocking, following, followRequested) => {
        if (blocking) {
          return 'Unblock'
        } else if (following) {
          return 'Unfollow'
        } else if (followRequested) {
          return 'Unfollow (follow requested)'
        } else {
          return 'Follow'
        }
      },
      followIcon: (blocking, following, followRequested) => {
        if (blocking) {
          return '#fa-unlock'
        } else if (following) {
          return '#fa-user-times'
        } else if (followRequested) {
          return '#fa-hourglass'
        } else {
          return '#fa-user-plus'
        }
      },
      shown: (verifyCredentials, relationship) => {
        return verifyCredentials && relationship && verifyCredentials.id !== relationship.id
      }
    },
    components: {
      IconButton
    }
  }
</script>