<?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>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>4.1.0</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.sineltek</groupId>
	<artifactId>lis</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name/>
	<description/>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>25</java.version>
		<archunit.version>1.4.2</archunit.version>
		<jacoco.version>0.8.15</jacoco.version>
		<spotless.version>3.9.0</spotless.version>
		<google-java-format.version>1.27.0</google-java-format.version>
		<!-- OpenTelemetry Instrumentation 2.28.1 apunta al SDK 1.62.0 de Boot 4.1.0. -->
		<opentelemetry-instrumentation.version>2.28.1-alpha</opentelemetry-instrumentation.version>
		<!-- Postgres local (docker-compose), usado solo por el perfil manual "jooq-codegen"
		     para migrar y generar jOOQ contra un esquema real. DDLDatabase (parsear los .sql
		     sin BD viva) no soporta TEXT+UNIQUE (jOOQ#9336) y el esquema del LIS usa TEXT en
		     todo. El build normal (mvn verify, Docker, CI) no activa ese perfil y no necesita
		     Postgres corriendo. -->
		<db.codegen.url>jdbc:postgresql://localhost:5432/lis</db.codegen.url>
		<db.codegen.user>postgres</db.codegen.user>
		<db.codegen.password>postgres</db.codegen.password>
		<db.schema>lis</db.schema>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-flyway</artifactId>
		</dependency>
		<dependency>
			<groupId>org.flywaydb</groupId>
			<artifactId>flyway-database-postgresql</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jooq</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-opentelemetry</artifactId>
		</dependency>
		<dependency>
			<groupId>io.opentelemetry.instrumentation</groupId>
			<artifactId>opentelemetry-logback-appender-1.0</artifactId>
			<version>${opentelemetry-instrumentation.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-validation</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webmvc</artifactId>
		</dependency>
		<!-- Thymeleaf se conserva para RELLENAR PLANTILLAS DE MENSAJE (cuerpos de correo y
		     similares), no para servir paginas: el borde del sistema es una API HTTP (D-03).
		     Las plantillas viven en src/main/resources/plantillas, no en templates.
		     Fuera quedaron dos dependencias, por ADR-0009:
		       * spring-security-webauthn: la identidad la emite un proveedor externo, asi que
		         passkeys, OTT y MFA son configuracion del IdP y no codigo de este servicio.
		       * thymeleaf-extras-springsecurity6: solo sirve para etiquetas sec: en paginas
		         HTML, y aqui no hay paginas. -->
		<!-- UUIDv7 generado en la aplicacion: el agregado nace con identidad antes de
		     persistirse. El DDL declara default uuidv7() (PostgreSQL 18) como respaldo
		     para insercion manual, no como fuente de identidad del dominio. -->
		<dependency>
			<groupId>com.fasterxml.uuid</groupId>
			<artifactId>java-uuid-generator</artifactId>
			<version>5.2.0</version>
		</dependency>

		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-flyway-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jooq-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-opentelemetry-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- Exportador en memoria para afirmar que un log llega al SDK sin salir a la red.
		     La version la gestiona el opentelemetry-bom que importa Spring Boot. -->
		<dependency>
			<groupId>io.opentelemetry</groupId>
			<artifactId>opentelemetry-sdk-testing</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-validation-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webmvc-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- Integracion contra PostgreSQL 18 real: el esquema del LIS apoya reglas del
		     dominio en triggers, restricciones de exclusion y btree_gist. Mockear el
		     repositorio no prueba nada de eso. -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-testcontainers</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.testcontainers</groupId>
			<artifactId>testcontainers-junit-jupiter</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.testcontainers</groupId>
			<artifactId>testcontainers-postgresql</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- La regla de dependencias (api -> aplicacion -> dominio) como test ejecutable. -->
		<dependency>
			<groupId>com.tngtech.archunit</groupId>
			<artifactId>archunit-junit5</artifactId>
			<version>${archunit.version}</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<!-- Sin <executions>: no se engancha a ninguna fase del build normal. Existe para
				     `./mvnw flyway:migrate` (make migrate) y para el perfil jooq-codegen, que solo
				     le anade el binding a generate-sources. La version la gestiona el parent de
				     Spring Boot; el driver de Postgres lo toma del classpath del proyecto. -->
				<groupId>org.flywaydb</groupId>
				<artifactId>flyway-maven-plugin</artifactId>
				<configuration>
					<url>${db.codegen.url}</url>
					<user>${db.codegen.user}</user>
					<password>${db.codegen.password}</password>
					<schemas>
						<schema>${db.schema}</schema>
					</schemas>
					<defaultSchema>${db.schema}</defaultSchema>
					<locations>
						<location>filesystem:src/main/resources/db/migration</location>
					</locations>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.jacoco</groupId>
				<artifactId>jacoco-maven-plugin</artifactId>
				<version>${jacoco.version}</version>
				<executions>
					<execution>
						<id>prepare-agent</id>
						<goals>
							<goal>prepare-agent</goal>
						</goals>
					</execution>
					<execution>
						<id>report</id>
						<phase>test</phase>
						<goals>
							<goal>report</goal>
						</goals>
					</execution>
					<execution>
						<id>check-domain-coverage</id>
						<phase>verify</phase>
						<goals>
							<goal>check</goal>
						</goals>
						<configuration>
							<rules>
								<rule>
									<element>BUNDLE</element>
									<includes>
										<!-- Cobertura exigida donde viven las invariantes clinicas, no global. -->
										<include>**/dominio/**</include>
										<include>**/aplicacion/**</include>
									</includes>
									<limits>
										<limit>
											<counter>LINE</counter>
											<value>COVEREDRATIO</value>
											<minimum>0.90</minimum>
										</limit>
									</limits>
								</rule>
							</rules>
							<!-- ASSUMPTION: todavia no existen paquetes dominio/ ni aplicacion/ (M0).
							     Sin clases que coincidan con el include, Jacoco no falla la regla.
							     Se activa sola con el primer slice de M1. -->
							<haltOnFailure>true</haltOnFailure>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>com.diffplug.spotless</groupId>
				<artifactId>spotless-maven-plugin</artifactId>
				<version>${spotless.version}</version>
				<configuration>
					<java>
						<!-- El codigo generado por jOOQ se versiona pero no se formatea ni se revisa. -->
						<excludes>
							<exclude>src/main/java/com/sineltek/lis/jooq/**</exclude>
						</excludes>
						<googleJavaFormat>
							<version>${google-java-format.version}</version>
						</googleJavaFormat>
						<removeUnusedImports/>
						<importOrder/>
					</java>
				</configuration>
				<executions>
					<execution>
						<id>spotless-check</id>
						<phase>verify</phase>
						<goals>
							<goal>check</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

	<profiles>
		<!-- Perfil manual, NO ligado al build por defecto: un `docker build` o un runner de CI
		     no tienen forma de alcanzar un Postgres real en generate-sources. Los fuentes jOOQ
		     se versionan en src/main/java/com/sineltek/lis/jooq y se regeneran a mano solo
		     cuando cambia el esquema, con el docker-compose levantado:

		         docker compose up -d db
		         ./mvnw -Pjooq-codegen generate-sources

		     Regla derivada: ninguna migracion nueva se da por terminada hasta que el codigo
		     generado que la acompana esta en el mismo commit. -->
		<profile>
			<id>jooq-codegen</id>
			<build>
				<plugins>
					<plugin>
						<!-- Migra el Postgres local ANTES del codegen: misma fase, ejecuta primero por
						     orden de declaracion. La configuracion (url, esquema, locations) se hereda
						     del build principal; aqui solo vive el binding de fase. -->
						<groupId>org.flywaydb</groupId>
						<artifactId>flyway-maven-plugin</artifactId>
						<executions>
							<execution>
								<id>migrate-for-jooq-codegen</id>
								<phase>generate-sources</phase>
								<goals>
									<goal>migrate</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
					<plugin>
						<groupId>org.jooq</groupId>
						<artifactId>jooq-codegen-maven</artifactId>
						<executions>
							<execution>
								<id>generate-jooq-sources</id>
								<phase>generate-sources</phase>
								<goals>
									<goal>generate</goal>
								</goals>
							</execution>
						</executions>
						<dependencies>
							<dependency>
								<groupId>org.postgresql</groupId>
								<artifactId>postgresql</artifactId>
								<version>${postgresql.version}</version>
							</dependency>
						</dependencies>
						<configuration>
							<jdbc>
								<driver>org.postgresql.Driver</driver>
								<url>${db.codegen.url}</url>
								<user>${db.codegen.user}</user>
								<password>${db.codegen.password}</password>
							</jdbc>
							<generator>
								<database>
									<name>org.jooq.meta.postgres.PostgresDatabase</name>
									<inputSchema>${db.schema}</inputSchema>
									<!-- Fuera del codigo generado:
									     - flyway_schema_history: no es del dominio.
									     - Las particiones de evento_auditoria: la insercion va contra la
									       tabla particionada, nunca contra una particion.
									     - Las ~212 funciones de soporte de btree_gist (gbt_*, gbtreekey*,
									       *_dist, gist_translate_cmptype_btree): las llama el motor dentro
									       del indice GiST al evaluar las restricciones de exclusion de
									       vigencias. Reciben tipos "internal" que un cliente no puede
									       construir, asi que su binding Java no es invocable. Los doce
									       *_dist se enumeran por nombre en vez de usar .*_dist para no
									       excluir por accidente un objeto propio en el futuro. -->
									<excludes>flyway_schema_history|evento_auditoria_2026|evento_auditoria_default|gbt_.*|gbtreekey.*|gist_translate_cmptype_btree|(cash|date|float4|float8|int2|int4|int8|interval|oid|time|ts|tstz)_dist</excludes>
									<includeTables>true</includeTables>
									<!-- Las vistas del esquema (v_lista_trabajo, v_resultados_para_informe,
									     v_tiempos_respuesta) son modelo de lectura de primera clase. -->
									<forcedTypes/>
								</database>
								<generate>
									<javaTimeTypes>true</javaTimeTypes>
									<comments>true</comments>
								</generate>
								<target>
									<!-- Escribe en src/main/java (no target/): queda versionado y un build
									     normal no depende de que haya un Postgres alcanzable. -->
									<packageName>com.sineltek.lis.jooq</packageName>
									<directory>src/main/java</directory>
								</target>
							</generator>
						</configuration>
					</plugin>
				</plugins>
			</build>
		</profile>
	</profiles>

</project>
