package {{basePackage}}

import org.springframework.context.annotation.Bean
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.RequestMapping
{{#sourceDocumentationProvider}}
    import com.fasterxml.jackson.dataformat.yaml.YAMLMapper
    import org.springframework.beans.factory.annotation.Value
    import org.springframework.core.io.Resource
    import org.springframework.util.StreamUtils
    import org.springframework.web.bind.annotation.ResponseBody
    import org.springframework.web.bind.annotation.GetMapping
{{/sourceDocumentationProvider}}
{{^sourceDocumentationProvider}}
    {{#useSwaggerUI}}
        import org.springframework.web.bind.annotation.ResponseBody
        import org.springframework.web.bind.annotation.GetMapping
    {{/useSwaggerUI}}
{{/sourceDocumentationProvider}}
{{#reactive}}
    import org.springframework.web.reactive.function.server.HandlerFunction
    import org.springframework.web.reactive.function.server.RequestPredicates.GET
    import org.springframework.web.reactive.function.server.RouterFunction
    import org.springframework.web.reactive.function.server.RouterFunctions.route
    import org.springframework.web.reactive.function.server.ServerResponse
    import java.net.URI
{{/reactive}}
{{#sourceDocumentationProvider}}
    import java.nio.charset.Charset
{{/sourceDocumentationProvider}}

/**
* Home redirection to OpenAPI api documentation
*/
@Controller
class HomeController {
{{#useSwaggerUI}}
    {{^springDocDocumentationProvider}}
        {{#sourceDocumentationProvider}}
            private val apiDocsPath = "/openapi.json"
        {{/sourceDocumentationProvider}}
        {{#springFoxDocumentationProvider}}
            private val apiDocsPath = "/v2/api-docs"
        {{/springFoxDocumentationProvider}}
    {{/springDocDocumentationProvider}}
{{/useSwaggerUI}}
{{#sourceDocumentationProvider}}
    private val yamlMapper = YAMLMapper()

    @Value("classpath:/openapi.yaml")
    private lateinit var openapi: Resource

    @Bean
    fun openapiContent(): String {
    return openapi.inputStream.use {
    StreamUtils.copyToString(it, Charset.defaultCharset())
    }
    }

    @GetMapping(value = ["/openapi.yaml"], produces = ["application/vnd.oai.openapi"])
    @ResponseBody
    fun openapiYaml(): String = openapiContent()

    @GetMapping(value = ["/openapi.json"], produces = ["application/json"])
    @ResponseBody
    fun openapiJson(): Any = yamlMapper.readValue(openapiContent(), Any::class.java)
{{/sourceDocumentationProvider}}
{{#useSwaggerUI}}
    {{^springDocDocumentationProvider}}

        @GetMapping(value = ["/swagger-config.yaml"], produces = ["text/plain"])
        @ResponseBody
        fun swaggerConfig(): String = "url: $apiDocsPath\n"
    {{/springDocDocumentationProvider}}
    {{#reactive}}

        @Bean
        fun index(): RouterFunction
        <ServerResponse> = route(
            GET("/"), HandlerFunction
        <ServerResponse> {
            ServerResponse.temporaryRedirect(URI.create("swagger-ui.html")).build()
            })
    {{/reactive}}
    {{^reactive}}

            @RequestMapping("/")
            fun index(): String = "redirect:swagger-ui.html"
    {{/reactive}}
{{/useSwaggerUI}}
    }
