import { activityPub } from '../ActivityPub'
import { constructIdFromName } from './index'
const debug = require('debug')('ea:utils:collections')

export function createOrderedCollection(name, collectionName) {
  return {
    '@context': 'https://www.w3.org/ns/activitystreams',
    id: `${activityPub.endpoint}/activitypub/users/${name}/${collectionName}`,
    summary: `${name}s ${collectionName} collection`,
    type: 'OrderedCollection',
    first: `${activityPub.endpoint}/activitypub/users/${name}/${collectionName}?page=true`,
    totalItems: 0,
  }
}

export function createOrderedCollectionPage(name, collectionName) {
  return {
    '@context': 'https://www.w3.org/ns/activitystreams',
    id: `${activityPub.endpoint}/activitypub/users/${name}/${collectionName}?page=true`,
    summary: `${name}s ${collectionName} collection`,
    type: 'OrderedCollectionPage',
    totalItems: 0,
    partOf: `${activityPub.endpoint}/activitypub/users/${name}/${collectionName}`,
    orderedItems: [],
  }
}
export function sendCollection(collectionName, req, res) {
  const name = req.params.name
  const id = constructIdFromName(name)

  switch (collectionName) {
    case 'followers':
      attachThenCatch(activityPub.collections.getFollowersCollection(id), res)
      break

    case 'followersPage':
      attachThenCatch(activityPub.collections.getFollowersCollectionPage(id), res)
      break

    case 'following':
      attachThenCatch(activityPub.collections.getFollowingCollection(id), res)
      break

    case 'followingPage':
      attachThenCatch(activityPub.collections.getFollowingCollectionPage(id), res)
      break

    case 'outbox':
      attachThenCatch(activityPub.collections.getOutboxCollection(id), res)
      break

    case 'outboxPage':
      attachThenCatch(activityPub.collections.getOutboxCollectionPage(id), res)
      break

    default:
      res.status(500).end()
  }
}

function attachThenCatch(promise, res) {
  return promise
    .then(collection => {
      res
        .status(200)
        .contentType('application/activity+json')
        .send(collection)
    })
    .catch(err => {
      debug(`error getting a Collection: = ${err}`)
      res.status(500).end()
    })
}
