/*eslint quotes: ["off", "single"]*/

import type { DistSwaggerUIOptions } from '../src/swagger/renderer'
import { renderSwaggerUIOptions } from '../src/swagger/renderer'

type TestCase = [description: string, config: DistSwaggerUIOptions, expected: string]

describe('SwaggerUIOption Rendering', () => {
  const baseUrl = 'https://petstore3.swagger.io/api/v3/openapi.json'
  const commonTests: TestCase[] = [
    [
      'configUrl',
      { configUrl: baseUrl, url: baseUrl },
      `configUrl: '${baseUrl}',url: '${baseUrl}'`,
    ],
    [
      'presets',
      { presets: ['SwaggerUIBundle.presets.apis', 'SwaggerUIStandalonePreset'], url: baseUrl },
      `presets: [SwaggerUIBundle.presets.apis,SwaggerUIStandalonePreset],url: '${baseUrl}'`,
    ],
    [
      'plugins',
      { plugins: ['SwaggerUIBundle.plugins.DownloadUrl'], url: baseUrl },
      `plugins: [SwaggerUIBundle.plugins.DownloadUrl],url: '${baseUrl}'`,
    ],
    ['deepLinking', { deepLinking: true, url: baseUrl }, `deepLinking: true,url: '${baseUrl}'`],
    [
      'spec',
      {
        spec: {
          openapi: '3.0.0',
          info: { title: 'Swagger Petstore', version: '1.0.0' },
          servers: [{ url: 'https://petstore3.swagger.io/api/v3' }],
        },
        url: baseUrl,
      },
      `spec: {"openapi":"3.0.0","info":{"title":"Swagger Petstore","version":"1.0.0"},"servers":[{"url":"https://petstore3.swagger.io/api/v3"}]},url: '${baseUrl}'`,
    ],
    [
      'layout',
      { layout: 'StandaloneLayout', url: baseUrl },
      `layout: 'StandaloneLayout',url: '${baseUrl}'`,
    ],
    [
      'docExpansion',
      { docExpansion: 'list', url: baseUrl },
      `docExpansion: 'list',url: '${baseUrl}'`,
    ],
    [
      'maxDisplayedTags',
      { maxDisplayedTags: 5, url: baseUrl },
      `maxDisplayedTags: 5,url: '${baseUrl}'`,
    ],
    [
      'operationsSorter',
      { operationsSorter: '(a, b) => a.path.localeCompare(b.path)', url: baseUrl },
      `operationsSorter: (a, b) => a.path.localeCompare(b.path),url: '${baseUrl}'`,
    ],
    [
      'requestInterceptor',
      { requestInterceptor: '(req) => req', url: baseUrl },
      `requestInterceptor: (req) => req,url: '${baseUrl}'`,
    ],
    [
      'responseInterceptor',
      { responseInterceptor: '(res) => res', url: baseUrl },
      `responseInterceptor: (res) => res,url: '${baseUrl}'`,
    ],
    [
      'persistAuthorization',
      { persistAuthorization: true, url: baseUrl },
      `persistAuthorization: true,url: '${baseUrl}'`,
    ],
    [
      'defaultModelsExpandDepth',
      { defaultModelsExpandDepth: 1, url: baseUrl },
      `defaultModelsExpandDepth: 1,url: '${baseUrl}'`,
    ],
    [
      'defaultModelExpandDepth',
      { defaultModelExpandDepth: 2, url: baseUrl },
      `defaultModelExpandDepth: 2,url: '${baseUrl}'`,
    ],
    [
      'defaultModelRendering',
      { defaultModelRendering: 'model', url: baseUrl },
      `defaultModelRendering: 'model',url: '${baseUrl}'`,
    ],
    [
      'displayRequestDuration',
      { displayRequestDuration: true, url: baseUrl },
      `displayRequestDuration: true,url: '${baseUrl}'`,
    ],
    ['filter', { filter: true, url: baseUrl }, `filter: true,url: '${baseUrl}'`],
    [
      'showExtensions',
      { showExtensions: true, url: baseUrl },
      `showExtensions: true,url: '${baseUrl}'`,
    ],
    [
      'showCommonExtensions',
      { showCommonExtensions: true, url: baseUrl },
      `showCommonExtensions: true,url: '${baseUrl}'`,
    ],
    [
      'queryConfigEnabled',
      { queryConfigEnabled: true, url: baseUrl },
      `queryConfigEnabled: true,url: '${baseUrl}'`,
    ],
    [
      'displayOperationId',
      { displayOperationId: true, url: baseUrl },
      `displayOperationId: true,url: '${baseUrl}'`,
    ],
    [
      'tagsSorter',
      { tagsSorter: '(a, b) => a.name.localeCompare(b.name)', url: baseUrl },
      `tagsSorter: (a, b) => a.name.localeCompare(b.name),url: '${baseUrl}'`,
    ],
    [
      'onComplete',
      { onComplete: '() => console.log("Completed")', url: baseUrl },
      `onComplete: () => console.log("Completed"),url: '${baseUrl}'`,
    ],
    [
      'syntaxHighlight as false',
      { syntaxHighlight: false, url: baseUrl },
      `syntaxHighlight: false,url: '${baseUrl}'`,
    ],
    [
      'syntaxHighlight as object',
      { syntaxHighlight: { activated: true, theme: ['agate', 'arta'] }, url: baseUrl },
      `syntaxHighlight: {"activated":true,"theme":["agate","arta"]},url: '${baseUrl}'`,
    ],
    [
      'tryItOutEnabled',
      { tryItOutEnabled: true, url: baseUrl },
      `tryItOutEnabled: true,url: '${baseUrl}'`,
    ],
    [
      'requestSnippetsEnabled',
      { requestSnippetsEnabled: true, url: baseUrl },
      `requestSnippetsEnabled: true,url: '${baseUrl}'`,
    ],
    [
      'requestSnippets',
      { requestSnippets: { generators: { curl_bash: { title: 'cURL (bash)' } } }, url: baseUrl },
      `requestSnippets: {"generators":{"curl_bash":{"title":"cURL (bash)"}}},url: '${baseUrl}'`,
    ],
    [
      'oauth2RedirectUrl',
      { oauth2RedirectUrl: 'https://example.com/oauth2-redirect.html', url: baseUrl },
      `oauth2RedirectUrl: 'https://example.com/oauth2-redirect.html',url: '${baseUrl}'`,
    ],
    [
      'showMutableRequest',
      { showMutabledRequest: true, url: baseUrl },
      `showMutabledRequest: true,url: '${baseUrl}'`,
    ],
    [
      'request',
      { request: { curlOptions: ['--insecure'] }, url: baseUrl },
      `request: {"curlOptions":["--insecure"]},url: '${baseUrl}'`,
    ],
    [
      'supportedSubmitMethods',
      { supportedSubmitMethods: ['get', 'post', 'put'], url: baseUrl },
      `supportedSubmitMethods: ["get","post","put"],url: '${baseUrl}'`,
    ],
    [
      'validatorUrl',
      { validatorUrl: 'https://validator.swagger.io', url: baseUrl },
      `validatorUrl: 'https://validator.swagger.io',url: '${baseUrl}'`,
    ],
    [
      'withCredentials',
      { withCredentials: true, url: baseUrl },
      `withCredentials: true,url: '${baseUrl}'`,
    ],
    [
      'modelPropertyMacro',
      { modelPropertyMacro: '(property) => property', url: baseUrl },
      `modelPropertyMacro: (property) => property,url: '${baseUrl}'`,
    ],
    [
      'parameterMacro',
      { parameterMacro: '(parameter) => parameter', url: baseUrl },
      `parameterMacro: (parameter) => parameter,url: '${baseUrl}'`,
    ],
  ]

  it.each(commonTests)('renders correctly with %s', (_, input, expected) => {
    expect(renderSwaggerUIOptions(input)).toEqual(expected)
  })
})
