'use strict';

const { objectType, nonNull } = require('nexus');
const { defaultTo, prop, pipe } = require('lodash/fp');

module.exports = ({ strapi }) => {
  const { naming } = strapi.plugin('graphql').service('utils');
  const { RESPONSE_COLLECTION_META_TYPE_NAME } = strapi.plugin('graphql').service('constants');

  return {
    /**
     * Build a type definition for a content API collection response for a given content type
     * @param {object} contentType The content type which will be used to build its content API response definition
     * @return {NexusObjectTypeDef}
     */
    buildResponseCollectionDefinition(contentType) {
      const name = naming.getEntityResponseCollectionName(contentType);
      const entityName = naming.getEntityName(contentType);

      return objectType({
        name,

        definition(t) {
          t.nonNull.list.field('data', {
            type: nonNull(entityName),

            resolve: pipe(
              prop('nodes'),
              defaultTo([])
            ),
          });

          t.nonNull.field('meta', {
            type: RESPONSE_COLLECTION_META_TYPE_NAME,

            // Pass down the args stored in the source object
            resolve: prop('info'),
          });
        },
      });
    },
  };
};
