<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>io.kalix</groupId>
        <artifactId>kalix-maven-java</artifactId>
        <version>1.5.2</version>
    </parent>
    
    <groupId>io.kalix</groupId>
    <artifactId>kalix-java-sdk-protobuf-parent</artifactId>
    <version>1.5.2</version>
    <packaging>pom</packaging>


    <name>Kalix Java Protobuf Parent pom</name>
    <description>
        This is the parent pom for Kalix applications.
        It contains all dependencies and plugins to build a Kalix service using the Kalix Java Protobuf SDK.
    </description>

    <properties>
        <!-- archetype need to override kalixContainerRegistry and kalixOrganization -->
        <kalixContainerRegistry>kcr.us-east-1.kalix.io</kalixContainerRegistry>
        <kalixOrganization>acme</kalixOrganization>


        <dockerImage>${kalixContainerRegistry}/${kalixOrganization}/${project.artifactId}</dockerImage>
        <dockerTag>${project.version}-${build.timestamp}</dockerTag>

        <docker.base.image>docker.io/library/eclipse-temurin:21.0.2_13-jre-jammy</docker.base.image>
        <docker.platform>linux/amd64</docker.platform>

        <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
        <java.version>21</java.version>
        <maven.compiler.release>${java.version}</maven.compiler.release>
    
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <kalix-sdk.version>1.5.2</kalix-sdk.version>
        <akka-grpc.version>2.1.6</akka-grpc.version>

        <!-- plugin versions -->
        <maven-shade-plugin.version>2.1</maven-shade-plugin.version>
        <maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
        <protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version>
        <docker-maven-plugin.version>0.44.0</docker-maven-plugin.version>
        <build-helper-maven-plugin.version>3.2.0</build-helper-maven-plugin.version>
        <maven-failsafe-plugin.version>3.1.2</maven-failsafe-plugin.version>
        <maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
        <maven-deploy-plugin.version>3.1.1</maven-deploy-plugin.version>
        <skip.docker>false</skip.docker>
    </properties>


    <pluginRepositories>
        <pluginRepository>
            <id>akka-repository</id>
            <url>https://repo.akka.io/maven</url>
        </pluginRepository>
    </pluginRepositories>

    <repositories>
        <repository>
            <id>akka-repository</id>
            <name>Akka library repository</name>
            <url>https://repo.akka.io/maven</url>
        </repository>
    </repositories>


    <build>
        <resources>
            <!-- Add the generated protobuf descriptor to the classpath, so that source mapping works -->
            <resource>
                <directory>${project.build.directory}/generated-resources</directory>
            </resource>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
            </resource>
        </resources>

        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.7.1</version>
            </extension>
        </extensions>

        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>${maven-shade-plugin.version}</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                    <resource>reference.conf</resource>
                                </transformer>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>${mainClass}</mainClass>
                                </transformer>
                            </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven-compiler-plugin.version}</version>
                    <configuration>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                        <compilerArgs>
                            <arg>-Xlint:deprecation</arg>
                            <arg>-parameters</arg>
                        </compilerArgs>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.xolstice.maven.plugins</groupId>
                    <artifactId>protobuf-maven-plugin</artifactId>
                    <version>${protobuf-maven-plugin.version}</version>
                    <executions>
                    <execution>
                        <!-- generate Java code for protobuf types -->
                        <id>protobuf</id>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        <configuration>
                        <writeDescriptorSet>true</writeDescriptorSet>
                        <includeSourceInfoInDescriptorSet>true</includeSourceInfoInDescriptorSet>
                        <includeDependenciesInDescriptorSet>true</includeDependenciesInDescriptorSet>
                        <descriptorSetFileName>user-function.desc</descriptorSetFileName>
                        <checkStaleness>true</checkStaleness>
                        <protocArtifact>com.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier}</protocArtifact>
                        <protocPlugins>
                            <protocPlugin>
                            <id>akka-grpc</id>
                            <groupId>com.lightbend.akka.grpc</groupId>
                            <artifactId>akka-grpc-scalapb-protoc-plugin_2.12</artifactId>
                            <version>${akka-grpc.version}</version>
                            <mainClass>akka.grpc.gen.Main</mainClass>
                            </protocPlugin>
                        </protocPlugins>
                        </configuration>
                    </execution>
                </executions>
                </plugin>

                <plugin>
                    <groupId>io.fabric8</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>${docker-maven-plugin.version}</version>
                    <configuration>
                    <images>
                        <image>
                        <name>${dockerImage}:%l</name>
                        <build>
                            <!-- Base Docker image which contains jre-->
                            <from>${docker.base.image}</from>
                            <createImageOptions>
                                <platform>${docker.platform}</platform>
                            </createImageOptions>
                            <tags>
                            <!-- tag for generated image -->
                            <tag>${dockerTag}</tag>
                            </tags>
                            <ports>
                            <!-- expose port in Docker container -->
                            <port>8080</port>
                            </ports>
                            <assembly>
                            <!-- NOTE: (optional) switch to "artifact-with-dependencies" to show dependencies library-->
                            <descriptorRef>artifact</descriptorRef>
                            </assembly>
                            <entryPoint>
                            <arg>java</arg>
                            <arg>-jar</arg>
                            <arg>/maven/${project.build.finalName}.jar</arg>
                            </entryPoint>
                        </build>
                        </image>
                    </images>
                    </configuration>
                    <executions>
                    <execution>
                        <id>build-docker-image</id>
                        <phase>install</phase>
                        <goals>
                        <goal>build</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>push-docker-image</id>
                        <phase>deploy</phase>
                        <goals>
                        <goal>push</goal>
                        </goals>
                    </execution>
                    </executions>
                </plugin>

                <plugin>
                    <!-- configure src/it/java and src/it/resources -->
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <version>${build-helper-maven-plugin.version}</version>
                    <executions>
                    <execution>
                        <id>add-integration-test-source</id>
                        <phase>generate-test-sources</phase>
                        <goals>
                        <goal>add-test-source</goal>
                        </goals>
                        <configuration>
                        <sources>
                            <source>src/it/java</source>
                        </sources>
                        </configuration>
                    </execution>
                    <execution>
                        <id>add-integration-test-resource</id>
                        <phase>generate-test-resources</phase>
                        <goals>
                        <goal>add-test-resource</goal>
                        </goals>
                        <configuration>
                        <resources>
                            <resource>
                            <directory>${basedir}/src/it/resources</directory>
                            </resource>
                        </resources>
                        </configuration>
                    </execution>
                    </executions>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>${maven-surefire-plugin.version}</version>
                    <configuration>
                    <excludes>
                        <!-- ignore integration test classes -->
                        <exclude>**/*IntegrationTest</exclude>
                    </excludes>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>io.kalix</groupId>
                    <artifactId>kalix-maven-plugin</artifactId>
                    <version>${kalix-sdk.version}</version>
                    <executions>
                    <execution>
                        <goals>
                        <goal>generate</goal>
                        <goal>deploy</goal>
                        </goals>
                    </execution>
                    </executions>
                    <configuration>
                    <dockerImage>${dockerImage}:${dockerTag}</dockerImage>
                    <mainClass>${mainClass}</mainClass>
                    <integrationTestSourceDirectory>src/it/java</integrationTestSourceDirectory>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>${maven-deploy-plugin.version}</version>
                    <configuration>
                    <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
            </plugin>
            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
            </plugin>
            
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
            </plugin>
            
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
            </plugin>
            
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <configuration>
                    <skip>${skip.docker}</skip>
                </configuration>    
            </plugin>
            
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
            </plugin> 

            <plugin>
                <groupId>io.kalix</groupId>
                <artifactId>kalix-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <!-- run Integration Tests in src/it/java with `mvn verify -Pit`-->
            <id>it</id>
            <build>
                <plugins>
                    <plugin>
                        <!-- run *IntegrationTest with failsafe -->
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-failsafe-plugin</artifactId>
                        <version>${maven-failsafe-plugin.version}</version>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>integration-test</goal>
                                    <goal>verify</goal>
                                </goals>
                                <configuration>
                                    <includes>
                                        <include>**/*IntegrationTest</include>
                                    </includes>
                                </configuration>
                            </execution>
                        </executions>
                        <configuration>
                            <classesDirectory>${project.build.outputDirectory}</classesDirectory>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.kalix</groupId>
                <artifactId>kalix-java-sdk-protobuf</artifactId>
                <version>${kalix-sdk.version}</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>io.kalix</groupId>
                <artifactId>kalix-java-sdk-protobuf-testkit</artifactId>
                <version>${kalix-sdk.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>io.kalix</groupId>
            <artifactId>kalix-java-sdk-protobuf</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.kalix</groupId>
            <artifactId>kalix-java-sdk-protobuf-testkit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
