<?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>cloud.nstart.terravault.ordinis</groupId>
    <artifactId>ordinis-parent</artifactId>
    <version>0.1.0-SNAPSHOT</version>
  </parent>

  <artifactId>ordinis-app</artifactId>
  <name>Ordinis :: App (writer)</name>
  <description>Spring Boot main для writer side: REST admin + outbox publisher + ЦУОД bundle.</description>

  <dependencies>
    <dependency>
      <groupId>cloud.nstart.terravault.ordinis</groupId>
      <artifactId>ordinis-rest-api</artifactId>
    </dependency>
    <dependency>
      <groupId>cloud.nstart.terravault.ordinis</groupId>
      <artifactId>ordinis-notifications</artifactId>
    </dependency>
    <dependency>
      <groupId>cloud.nstart.terravault.ordinis</groupId>
      <artifactId>ordinis-cuod-bundle</artifactId>
    </dependency>

    <!-- Cross-cutting -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
    <dependency>
      <groupId>net.logstash.logback</groupId>
      <artifactId>logstash-logback-encoder</artifactId>
    </dependency>

    <!-- Observability — OpenTelemetry -->
    <dependency>
      <groupId>io.opentelemetry.instrumentation</groupId>
      <artifactId>opentelemetry-spring-boot-starter</artifactId>
    </dependency>

    <!-- Config + Vault -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-vault-config</artifactId>
    </dependency>

    <!-- Migrations module — нужен на classpath для миграций при тесте,
         в проде Liquibase запускается отдельным Job в k8s. -->
    <dependency>
      <groupId>cloud.nstart.terravault.ordinis</groupId>
      <artifactId>ordinis-migrations</artifactId>
      <scope>test</scope>
    </dependency>

    <!-- Test -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.kafka</groupId>
      <artifactId>spring-kafka-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>junit-jupiter</artifactId>
      <version>1.21.3</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>postgresql</artifactId>
      <version>1.21.3</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>kafka</artifactId>
      <version>1.21.3</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.awaitility</groupId>
      <artifactId>awaitility</artifactId>
      <scope>test</scope>
    </dependency>
    <!-- nimbus-jose-jwt — на compile classpath через ordinis-auth.
         Здесь не дублируем (тест-scope direct override compile-transitive
         и nimbus не попадает в Spring Boot fat jar). -->

    <dependency>
      <groupId>org.liquibase</groupId>
      <artifactId>liquibase-core</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!-- Resolves git.commit.id.abbrev / git.branch / git.tags из локального .git
           directory. Properties доступны для других plugin'ов в той же phase'е.
           CI без .git folder → плагин fallback'ит к "Unknown", это OK. -->
      <plugin>
        <groupId>io.github.git-commit-id</groupId>
        <artifactId>git-commit-id-maven-plugin</artifactId>
        <version>9.0.1</version>
        <executions>
          <execution>
            <id>git-info</id>
            <goals><goal>revision</goal></goals>
            <phase>validate</phase>
          </execution>
        </executions>
        <configuration>
          <failOnNoGitDirectory>false</failOnNoGitDirectory>
          <failOnUnableToExtractRepoInfo>false</failOnUnableToExtractRepoInfo>
          <skipPoms>false</skipPoms>
          <generateGitPropertiesFile>false</generateGitPropertiesFile>
          <includeOnlyProperties>
            <includeOnlyProperty>^git.commit.id.abbrev$</includeOnlyProperty>
            <includeOnlyProperty>^git.branch$</includeOnlyProperty>
            <includeOnlyProperty>^git.tags$</includeOnlyProperty>
            <includeOnlyProperty>^git.commit.time$</includeOnlyProperty>
          </includeOnlyProperties>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <!-- Генерирует META-INF/build-info.properties → Spring Boot создаёт
               BuildProperties bean → VersionController экспонирует /api/v1/version
               для UI update banner. См. ordinis-rest-api/.../web/VersionController.
               git.* properties resolved выше через git-commit-id-maven-plugin. -->
          <execution>
            <id>build-info</id>
            <goals><goal>build-info</goal></goals>
            <configuration>
              <additionalProperties>
                <commit>${git.commit.id.abbrev}</commit>
                <branch>${git.branch}</branch>
                <tag>${git.tags}</tag>
                <gitTime>${git.commit.time}</gitTime>
              </additionalProperties>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <!-- По умолчанию e2e тесты НЕ запускаются — нужны Postgres+Kafka
               через Testcontainers (требует Docker). Включить через профиль
               `-P e2e` (см. ниже). Локально: либо профиль, либо `-Dtest=*E2ETest`. -->
          <excludes>
            <exclude>**/e2e/*E2ETest.java</exclude>
          </excludes>
          <!-- Testcontainers требует DOCKER_HOST. На macOS Docker Desktop
               socket в ~/.docker/run, не /var/run. ENV не наследуется в
               forked surefire процесс по умолчанию — пробрасываем явно. -->
          <environmentVariables>
            <DOCKER_HOST>${env.DOCKER_HOST}</DOCKER_HOST>
            <DOCKER_API_VERSION>1.45</DOCKER_API_VERSION>
            <TESTCONTAINERS_RYUK_DISABLED>true</TESTCONTAINERS_RYUK_DISABLED>
            <!-- Для CI с docker:dind service: указывает testcontainers
                 что spawned контейнеры доступны через `docker` hostname,
                 не localhost. Локально пусто → testcontainers default. -->
            <TESTCONTAINERS_HOST_OVERRIDE>${env.TESTCONTAINERS_HOST_OVERRIDE}</TESTCONTAINERS_HOST_OVERRIDE>
          </environmentVariables>
          <systemPropertyVariables>
            <api.version>1.45</api.version>
          </systemPropertyVariables>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <!-- Включает e2e тесты (Testcontainers). Запускать на CI runner с DinD
           либо локально с Docker Desktop. -->
      <id>e2e</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
              <excludes combine.self="override"/>
              <includes>
                <include>**/e2e/*E2ETest.java</include>
              </includes>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>
