<template>
  <div>
    <div class="ui form">
      <div class="fields">
        <div class="ui six wide field">
          <input type="text" v-model="search" placeholder="Search by username, domain..." />
        </div>
        <div class="ui four wide inline field">
          <div class="ui checkbox">
            <input v-model="pending" type="checkbox">
            <label>Pending approval</label>
          </div>
        </div>
      </div>
    </div>
    <div class="ui hidden divider"></div>
    <table v-if="result" class="ui very basic single line unstackable table">
      <thead>
        <tr>
          <th>Actor</th>
          <th>Creation date</th>
          <th>Status</th>
          <th>Actions</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="follow in result.results">
          <td>
            {{ follow.actor.preferred_username }}@{{ follow.actor.domain }}
          </td>
          <td>
            <human-date :date="follow.creation_date"></human-date>
          </td>
          <td>
            <template v-if="follow.approved === true">
              <i class="check icon"></i> Approved
            </template>
            <template v-else-if="follow.approved === false">
              <i class="x icon"></i> Refused
            </template>
            <template v-else>
              <i class="clock icon"></i> Pending
            </template>
          </td>
          <td>
            <dangerous-button v-if="follow.approved !== false" class="tiny basic labeled icon" color='red' @confirm="updateFollow(follow, false)">
              <i class="x icon"></i> Deny
              <p slot="modal-header">Deny access?</p>
              <p slot="modal-content">By confirming, {{ follow.actor.preferred_username }}@{{ follow.actor.domain }} will be denied access to your library.</p>
              <p slot="modal-confirm">Deny</p>
            </dangerous-button>
            <dangerous-button v-if="follow.approved !== true" class="tiny basic labeled icon" color='green' @confirm="updateFollow(follow, true)">
              <i class="x icon"></i> Approve
              <p slot="modal-header">Approve access?</p>
              <p slot="modal-content">By confirming, {{ follow.actor.preferred_username }}@{{ follow.actor.domain }} will be granted access to your library.</p>
              <p slot="modal-confirm">Approve</p>
            </dangerous-button>
          </td>
        </tr>
      </tbody>
      <tfoot class="full-width">
        <tr>
          <th>
            <pagination
            v-if="result && result.results.length > 0"
            @page-changed="selectPage"
            :compact="true"
            :current="page"
            :paginate-by="paginateBy"
            :total="result.count"
            ></pagination>
          </th>
          <th v-if="result && result.results.length > 0">
            Showing results {{ ((page-1) * paginateBy) + 1 }}-{{ ((page-1) * paginateBy) + result.results.length }} on {{ result.count }}</th>
          <th></th>
          <th></th>
        </tr>
      </tfoot>
    </table>
  </div>
</template>

<script>
import axios from 'axios'
import _ from 'lodash'

import Pagination from '@/components/Pagination'

export default {
  props: {
    filters: {type: Object, required: false, default: () => {}}
  },
  components: {
    Pagination
  },
  data () {
    return {
      isLoading: false,
      result: null,
      page: 1,
      paginateBy: 25,
      search: '',
      pending: false
    }
  },
  created () {
    this.fetchData()
  },
  methods: {
    fetchData () {
      let params = _.merge({
        'page': this.page,
        'page_size': this.paginateBy,
        'q': this.search
      }, this.filters)
      if (this.pending) {
        params.pending = true
      }
      let self = this
      self.isLoading = true
      axios.get('/federation/libraries/followers/', {params: params}).then((response) => {
        self.result = response.data
        self.isLoading = false
      }, error => {
        self.isLoading = false
        self.errors = error.backendErrors
      })
    },
    selectPage: function (page) {
      this.page = page
    },
    updateFollow (follow, approved) {
      let payload = {
        follow: follow.id,
        approved: approved
      }
      let self = this
      axios.patch('/federation/libraries/followers/', payload).then((response) => {
        follow.approved = response.data.approved
        self.isLoading = false
      }, error => {
        self.isLoading = false
        self.errors = error.backendErrors
      })
    }
  },
  watch: {
    search (newValue) {
      if (newValue.length > 0) {
        this.fetchData()
      }
    },
    page () {
      this.fetchData()
    },
    pending () {
      this.fetchData()
    }
  }
}
</script>