package org.openapitools.configuration;

import com.fasterxml.jackson.databind.node.ObjectNode;
import io.swagger.parser.OpenAPIParser;
import io.swagger.util.Yaml;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.servers.Server;
import io.swagger.v3.parser.core.models.ParseOptions;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;

import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Collections;

@Configuration
public class OpenAPIConfiguration {

    @Bean
    public OpenAPI openapi(
            @Value("classpath:/openapi.yaml") Resource openapiResource,
            @Value("${openapi.openAPIPetstore.base-path:/v3}") String apiBasePath) throws IOException {
        try(InputStream is = openapiResource.getInputStream()) {
            OpenAPI openAPI = new OpenAPIParser()
                    .readContents(StreamUtils.copyToString(is, Charset.defaultCharset()), null, new ParseOptions())
                    .getOpenAPI();
            ObjectNode node = Yaml.mapper().readValue(openapiResource.getInputStream(), ObjectNode.class);
            if (node.get("servers") == null) {
                openAPI.setServers(Collections.singletonList(new Server().url(apiBasePath)));
            }
            return openAPI;
        }
    }
}