const {decorateWithTags} = require('./util');

const Comment = {
  parent({parent_id}, _, {loaders: {Comments}}) {
    if (parent_id == null) {
      return null;
    }

    return Comments.get.load(parent_id);
  },
  user({author_id}, _, {loaders: {Users}}) {
    return Users.getByID.load(author_id);
  },
  recentReplies({id}, _, {loaders: {Comments}}) {
    return Comments.genRecentReplies.load(id);
  },
  replies({id, asset_id}, {sort, limit, excludeIgnored}, {loaders: {Comments}}) {
    return Comments.getByQuery({
      asset_id,
      parent_id: id,
      sort,
      limit,
      excludeIgnored,
    });
  },
  replyCount({id}, {excludeIgnored}, {user, loaders: {Comments}}) {

    // TODO: remove
    if (user && excludeIgnored) {
      return Comments.countByParentIDPersonalized({id, excludeIgnored});
    }
    return Comments.countByParentID.load(id);
  },
  actions({id}, _, {user, loaders: {Actions}}) {

    if (user && user.can('SEARCH_ACTIONS')) {
      return Actions.getByID.load(id);
    }

    return null;
  },
  action_summaries({id, action_summaries}, _, {loaders: {Actions}}) {
    if (action_summaries) {
      return action_summaries;
    }

    return Actions.getSummariesByItemID.load(id);
  },
  asset({asset_id}, _, {loaders: {Assets}}) {
    return Assets.getByID.load(asset_id);
  },
  async editing(comment, _, {loaders: {Settings}}) {
    const settings = await Settings.load();
    const editableUntil = new Date(Number(new Date(comment.created_at)) + settings.editCommentWindowLength);
    return {
      edited: comment.edited,
      editableUntil: editableUntil
    };
  }
};

// Decorate the Comment type resolver with a tags field.
decorateWithTags(Comment);

module.exports = Comment;
