'use strict';

const SchemaTypeOptions = require('./schemaTypeOptions');

/**
 * The options defined on a single nested schematype.
 *
 * #### Example:
 *
 *     const schema = Schema({ child: Schema({ name: String }) });
 *     schema.path('child').options; // SchemaSubdocumentOptions instance
 *
 * @api public
 * @inherits SchemaTypeOptions
 * @constructor SchemaSubdocumentOptions
 */

class SchemaSubdocumentOptions extends SchemaTypeOptions {}

const opts = require('./propertyOptions');

/**
 * If set, overwrites the child schema's `_id` option.
 *
 * #### Example:
 *
 *     const childSchema = Schema({ name: String });
 *     const parentSchema = Schema({
 *       child: { type: childSchema, _id: false }
 *     });
 *     parentSchema.path('child').schema.options._id; // false
 *
 * @api public
 * @property _id
 * @memberOf SchemaSubdocumentOptions
 * @type {Function|string}
 * @instance
 */

Object.defineProperty(SchemaSubdocumentOptions.prototype, '_id', opts);

/**
 * If set, overwrites the child schema's `minimize` option. In addition, configures whether the entire
 * subdocument can be minimized out.
 *
 * #### Example:
 *
 *     const childSchema = Schema({ name: String });
 *     const parentSchema = Schema({
 *       child: { type: childSchema, minimize: false }
 *     });
 *     const ParentModel = mongoose.model('Parent', parentSchema);
 *     // Saves `{ child: {} }` to the db. Without `minimize: false`, Mongoose would remove the empty
 *     // object and save `{}` to the db.
 *     await ParentModel.create({ child: {} });
 *
 * @api public
 * @property minimize
 * @memberOf SchemaSubdocumentOptions
 * @type {Function|string}
 * @instance
 */

Object.defineProperty(SchemaSubdocumentOptions.prototype, 'minimize', opts);

/**
 * Defines embedded discriminators for this single nested path.
 *
 * #### Example:
 *
 *     const eventSchema = Schema({ message: String }, { discriminatorKey: 'kind' });
 *     const clickedSchema = Schema({ element: String });
 *     const parentSchema = Schema({
 *       event: {
 *         type: eventSchema,
 *         discriminators: { Clicked: clickedSchema }
 *       }
 *     });
 *
 * @api public
 * @property discriminators
 * @memberOf SchemaSubdocumentOptions
 * @type {Object}
 * @instance
 */

Object.defineProperty(SchemaSubdocumentOptions.prototype, 'discriminators', opts);

module.exports = SchemaSubdocumentOptions;
