<?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>1.0.3</version>
    </parent>

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

    <name>openapi-generics-java-codegen-parent</name>
    <description>
        Parent POM for contract-aware Java client generation.
        Orchestrates OpenAPI Generator template extraction, patching, overlay, execution, and generated source registration.
    </description>

    <properties>
        <openapi-generator.version>7.23.0</openapi-generator.version>
        <maven.resources.plugin.version>3.5.0</maven.resources.plugin.version>
        <maven-antrun-plugin.version>3.2.0</maven-antrun-plugin.version>
        <build.helper.plugin.version>3.6.1</build.helper.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>${openapi-generics.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <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>
                                        <version>${openapi-generator.version}</version>
                                        <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.version}</version>
                                        <includes>META-INF/openapi-generics/templates/**</includes>
                                        <outputDirectory>${openapi.templates.codegen}</outputDirectory>
                                    </artifactItem>
                                </artifactItems>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>

                <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>

                <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>org.openapitools</groupId>
                            <artifactId>openapi-generator-core</artifactId>
                            <version>${openapi-generator.version}</version>
                        </dependency>

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

                        <dependency>
                            <groupId>io.github.blueprint-platform</groupId>
                            <artifactId>openapi-generics-java-codegen</artifactId>
                            <version>${openapi-generics.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>

                <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>

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

</project>