/**
 * ######################################################################
 * #                                                                    #
 * #                       Do not change the file!                      #
 * #                                                                    #
 * # All changes are deleted the next time the collection data is read. #
 * #                                                                    #
 * ######################################################################
 */

import { Document, DocumentQuery, Model } from 'mongoose';

import { extendIdType, extendTimestampType, virtualType as virtualTypeConvert } from '../types';

import { {{collectionNameLower}}Types } from '../documents/{{collectionNameLower}}';

import { methods, queries, statics, virtuals } from '../repositories/{{collectionNameLower}}';

type methodsType = typeof methods;
type staticsType = typeof statics;
type queriesType = typeof queries;
type virtualsType = virtualTypeConvert<typeof virtuals>;

/**
 * Document | Methods
 */
export interface {{interfaceName}}{{collectionNameUpper}}Document extends {{collectionNameLower}}Types, extendTimestampType, virtualsType, methodsType, Document {}

/**
 * DocumentQuery | Statics | Query
 */
export interface {{interfaceName}}{{collectionNameUpper}}DocumentQuery extends DocumentQuery<{{interfaceName}}{{collectionNameUpper}}Document | {{interfaceName}}{{collectionNameUpper}}Document[], {{interfaceName}}{{collectionNameUpper}}Document> {}

/**
 * Model
 */
export interface {{interfaceName}}{{collectionNameUpper}}Model extends staticsType, Model<{{interfaceName}}{{collectionNameUpper}}Document, queriesType> {}

/**
 * Virtual
 */
export interface {{interfaceName}}{{collectionNameUpper}}Virtual extends {{collectionNameLower}}Types, extendTimestampType, extendIdType {}
