import * as prettier from 'prettier';

import {
  IOptions
} from './types';
import {
  makeDefinitions
} from './definition-interface-generator';
import {
  makeApiInterfaces
} from './api-interface-generator';
import {
  OpenAPI2, OpenAPI3
} from 'jswagger-common';

export const WARNING_MESSAGE = `/**
* This file was auto-generated by jswagger-swagger.
* Do not make direct changes to the file.
*/


`;

const OUTPUT_HEADER = `import {
ApiRequestOptionsRX, ApiRequestOptionsRO, ApiRequestOptionsRR,
ApiRequestOptionsOX, ApiRequestOptionsOO, ApiRequestOptionsOR,
ApiRequestOptionsXX, ApiRequestOptionsXO, ApiRequestOptionsXR,
ApiResponse,
IApiSecurityContext,
internal
} from 'jswagger-client';

const toClassValue = internal.toClassValue;
const toJsonObject = internal.toJsonObject;
`;

function index(spec: OpenAPI2 | OpenAPI3, options?: IOptions) {
  const output: string[] = [
    WARNING_MESSAGE,
    OUTPUT_HEADER
  ];
  output.push(
    makeDefinitions(spec, options)
  );
  output.push(
    makeApiInterfaces(spec, options)
  );

  // Prettify output
  let prettierOptions: prettier.Options = {
    parser: 'typescript',
    singleQuote: true,
    jsxSingleQuote: true,
    semi: true,
    tabWidth: 2
  };
  if (options && options.prettierConfig) {
    prettierOptions = {
      ...prettierOptions,
      ...options.prettierConfig
    };
  }
  return prettier.format(output.join('\n'), prettierOptions);
}

export default index;
