<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>io.github.blueprint-platform</groupId>
        <artifactId>openapi-generics</artifactId>
        <version>0.9.0</version>
    </parent>

    <artifactId>openapi-generics-java-codegen-parent</artifactId>
    <packaging>pom</packaging>

    <name>openapi-generics-java-codegen-parent</name>
    <description>Parent POM for deterministic, generics-aware OpenAPI client generation. Provides build-time orchestration and standardized generator configuration.</description>
    <url>https://github.com/blueprint-platform/openapi-generics</url>

    <licenses>
        <license>
            <name>MIT License</name>
            <url>https://opensource.org/licenses/MIT</url>
            <distribution>repo</distribution>
        </license>
    </licenses>

    <scm>
        <url>https://github.com/blueprint-platform/openapi-generics</url>
        <connection>scm:git:https://github.com/blueprint-platform/openapi-generics.git</connection>
        <developerConnection>scm:git:ssh://git@github.com:blueprint-platform/openapi-generics.git</developerConnection>
        <tag>v0.9.0</tag>
    </scm>

    <developers>
        <developer>
            <id>bsayli</id>
            <name>Baris Sayli</name>
            <url>https://github.com/bsayli</url>
        </developer>
    </developers>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <openapi-generics-java-codegen.version>0.9.0</openapi-generics-java-codegen.version>
        <openapi-generator.version>7.21.0</openapi-generator.version>

        <maven.compiler.plugin.version>3.15.0</maven.compiler.plugin.version>
        <maven.resources.plugin.version>3.5.0</maven.resources.plugin.version>
        <maven.dependency.plugin.version>3.9.0</maven.dependency.plugin.version>
        <maven-antrun-plugin.version>3.2.0</maven-antrun-plugin.version>
        <build.helper.plugin.version>3.6.1</build.helper.plugin.version>

        <flatten-maven-plugin.version>1.7.3</flatten-maven-plugin.version>

        <openapi.templates.effective>${project.build.directory}/effective-templates</openapi.templates.effective>
        <openapi.generator.output>${project.build.directory}/generated-sources/openapi</openapi.generator.output>
        <openapi.generator.sourceFolder>src/gen/java</openapi.generator.sourceFolder>

        <openapi.generated.sources>${openapi.generator.output}/${openapi.generator.sourceFolder}</openapi.generated.sources>
        <openapi.templates.codegen>${project.build.directory}/codegen-templates</openapi.templates.codegen>
        <openapi.generics.skip>false</openapi.generics.skip>
    </properties>

    <dependencies>
        <dependency>
            <groupId>io.github.blueprint-platform</groupId>
            <artifactId>openapi-generics-contract</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.github.blueprint-platform</groupId>
                <artifactId>openapi-generics-platform-bom</artifactId>
                <version>0.9.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>

                <!-- EXTRACT TEMPLATE -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>${maven.dependency.plugin.version}</version>

                    <executions>
                        <execution>
                            <id>extract-openapi-model-template</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>unpack</goal>
                            </goals>

                            <configuration>
                                <skip>${openapi.generics.skip}</skip>
                                <artifactItems>
                                    <artifactItem>
                                        <groupId>org.openapitools</groupId>
                                        <artifactId>openapi-generator</artifactId>
                                        <type>jar</type>
                                        <overWrite>true</overWrite>
                                        <includes>**/Java/model.mustache</includes>
                                        <outputDirectory>${openapi.templates.effective}</outputDirectory>
                                    </artifactItem>
                                </artifactItems>
                            </configuration>
                        </execution>

                        <execution>
                            <id>extract-codegen-templates</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>unpack</goal>
                            </goals>

                            <configuration>
                                <skip>${openapi.generics.skip}</skip>
                                <artifactItems>
                                    <artifactItem>
                                        <groupId>io.github.blueprint-platform</groupId>
                                        <artifactId>openapi-generics-java-codegen</artifactId>
                                        <version>${openapi-generics-java-codegen.version}</version>
                                        <includes>META-INF/openapi-generics/templates/**</includes>
                                        <outputDirectory>${openapi.templates.codegen}</outputDirectory>
                                    </artifactItem>
                                </artifactItems>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>

                <!-- PATCH -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>${maven-antrun-plugin.version}</version>
                    <executions>
                        <execution>
                            <id>ensure-template-dir</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <target>
                                    <mkdir dir="${openapi.templates.effective}/Java"/>
                                </target>
                            </configuration>
                        </execution>
                        <execution>
                            <id>patch-openapi-model-template</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>

                            <configuration>
                                <skip>${openapi.generics.skip}</skip>
                                <target>

                                    <replaceregexp
                                            byline="false"
                                            flags="s"
                                            file="${openapi.templates.effective}/Java/model.mustache"
                                            match="\{\{#models\}\}\s*\{\{#model\}\}\s*\{\{#isEnum\}\}"
                                            replace="{{#models}}{{#model}}{{#vendorExtensions.x-api-wrapper}}{{>api_wrapper}}{{/vendorExtensions.x-api-wrapper}}{{^vendorExtensions.x-api-wrapper}}{{#isEnum}}"/>

                                    <replaceregexp
                                            byline="false"
                                            flags="s"
                                            file="${openapi.templates.effective}/Java/model.mustache"
                                            match="\{\{\/isEnum\}\}\s*\{\{\/model\}\}\s*\{\{\/models\}\}"
                                            replace="{{/isEnum}}{{/vendorExtensions.x-api-wrapper}}{{/model}}{{/models}}"/>

                                    <loadfile property="patchedModelTemplate"
                                              srcFile="${openapi.templates.effective}/Java/model.mustache"/>

                                    <condition property="wrapperPatchMissing">
                                        <not>
                                            <contains string="${patchedModelTemplate}"
                                                      substring="vendorExtensions.x-api-wrapper"/>
                                        </not>
                                    </condition>

                                    <fail message="OpenAPI template patch FAILED — upstream model.mustache structure changed."
                                          if="wrapperPatchMissing"/>

                                </target>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>

                <!-- TEMPLATE OVERLAY -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>${maven.resources.plugin.version}</version>

                    <executions>
                        <execution>
                            <id>overlay-local-templates</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>copy-resources</goal>
                            </goals>

                            <configuration>
                                <skip>${openapi.generics.skip}</skip>
                                <outputDirectory>${openapi.templates.effective}/Java</outputDirectory>

                                <resources>
                                    <resource>
                                        <directory>${openapi.templates.codegen}/META-INF/openapi-generics/templates</directory>
                                        <filtering>false</filtering>
                                    </resource>
                                </resources>
                            </configuration>
                        </execution>

                    </executions>
                </plugin>

                <plugin>
                    <groupId>org.openapitools</groupId>
                    <artifactId>openapi-generator-maven-plugin</artifactId>
                    <version>${openapi-generator.version}</version>

                    <dependencies>
                        <dependency>
                            <groupId>io.github.blueprint-platform</groupId>
                            <artifactId>openapi-generics-java-codegen</artifactId>
                            <version>${openapi-generics-java-codegen.version}</version>
                        </dependency>
                    </dependencies>

                    <configuration>

                        <output>${openapi.generator.output}</output>

                        <templateDirectory>${openapi.templates.effective}/Java</templateDirectory>

                        <configOptions>
                            <sourceFolder>${openapi.generator.sourceFolder}</sourceFolder>
                        </configOptions>

                    </configuration>
                </plugin>

                <!-- GENERATED SOURCES -->
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <version>${build.helper.plugin.version}</version>

                    <executions>
                        <execution>
                            <id>add-generated-sources</id>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>add-source</goal>
                            </goals>

                            <configuration>
                                <sources>
                                    <source>${openapi.generated.sources}</source>
                                </sources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.openapitools</groupId>
                <artifactId>openapi-generator-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
            </plugin>

            <!-- ✅ FLATTEN -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>flatten-maven-plugin</artifactId>
                <version>${flatten-maven-plugin.version}</version>
                <configuration>
                    <flattenMode>ossrh</flattenMode>
                </configuration>
                <executions>
                    <execution>
                        <id>flatten</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>flatten</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>flatten-clean</id>
                        <phase>clean</phase>
                        <goals>
                            <goal>clean</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>

    </build>

</project>