import { DecoratorsSchema } from './metadataGeneration/acceptedDecoratorsSchema';
export interface Config {
  /**
  * Swagger generation configuration object
  */
  swagger: SwaggerConfig;

  /**
  * Route generation configuration object
  */
  routes: RoutesConfig;

  decoratorsSchema: DecoratorsSchema;
}

export interface SwaggerConfig {
  /**
  * Generated SwaggerConfig.json will output here
  */
  outputDirectory: string;

  /**
  * The entry point to your API
  */
  entryFile: string;

  /**
  * API host, expressTemplate.g. localhost:3000 or https://myapi.com
  */
  host?: string;

  /**
  * API version number; defaults to npm package version
  */
  version?: string;

  /**
  * API name; defaults to npm package name
  */
  name?: string;

  /**
  * 'API description; defaults to npm package description
  */
  description?: string;

  /**
  * API license; defaults to npm package license
  */
  license?: string;

  /**
  * Base API path; e.g. the 'v1' in https://myapi.com/v1
  */
  basePath?: string;

  /**
  * Extend generated swagger spec with this object
  * Note that generated properties will always take precedence over what get specified here
  */
  spec?: any;

  /**
   * Alter how the spec is merged to generated swagger spec.
   * Possible values:
   *  - 'immediate' is overriding top level elements only thus you can not append a new path or alter an existing value without erasing same level elements.
   *  - 'recursive' proceed to a deep merge and will concat every branches or override or create new values if needed. @see https://www.npmjs.com/package/merge
   * The default is set to immediate so it is not breaking previous versions.
   * @default 'immediate'
   */
  specMerging?: 'immediate' | 'recursive';

  /**
   * Security Definitions Object
   * A declaration of the security schemes available to be used in the
   * specification. This does not enforce the security schemes on the operations
   * and only serves to provide the relevant details for each scheme.
   */
  securityDefinitions?: {
    [name: string]: {
      type: string;
      name?: string;
      authorizationUrl?: string;
      tokenUrl?: string;
      flow?: string;
      in?: string;
      scopes?: { [scopeName: string]: string; }
    }
  };
}

export interface RoutesConfig {
  /**
  * Routes directory; generated routes.ts (which contains the generated code wiring up routes using middleware of choice) will be dropped here
  */
  routesDir: string;

  /**
  * The entry point to your API
  */
  entryFile: string;

  /**
  * Base API path; e.g. the '/v1' in https://myapi.com/v1
  */
  basePath?: string;

  /**
  * Middleware provider.
  */
  middleware?: 'express' | 'hapi' | 'koa';

  /**
   * Override the Middleware template
  */
  middlewareTemplate?: string;

  /**
   * IOC module; e.g. './inversify/ioc' where IOC container named `iocContainer` is defined (https://github.com/inversify/InversifyJS)
   */
  iocModule?: string;

  /**
   * Authentication Module for express, hapi and koa
   */
  authenticationModule?: string;
}
