plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.4'
    id 'io.spring.dependency-management' version '1.1.3'
    id 'org.springdoc.openapi-gradle-plugin' version '1.8.0'
    id "io.swagger.swaggerhub" version "1.3.2"
    id 'edu.sc.seis.launch4j' version '3.0.5'
    id 'com.diffplug.spotless' version '6.25.0'
    id 'com.github.jk1.dependency-license-report' version '2.6'
}

import com.github.jk1.license.render.*

group = 'stirling.software'
version = '0.24.6'

//17 is lowest but we support and recommend 21
sourceCompatibility = '17'

repositories {
    mavenCentral()
}


licenseReport {
    renderers = [new JsonReportRenderer()]
}

sourceSets {
    main {
        java {
            if (System.getenv('DOCKER_ENABLE_SECURITY') == 'false') {
                exclude 'stirling/software/SPDF/config/security/**'
                exclude 'stirling/software/SPDF/controller/api/UserController.java'
                exclude 'stirling/software/SPDF/controller/web/AccountWebController.java'
                exclude 'stirling/software/SPDF/model/ApiKeyAuthenticationToken.java'
                exclude 'stirling/software/SPDF/model/Authority.java'
                exclude 'stirling/software/SPDF/model/PersistentLogin.java'
                exclude 'stirling/software/SPDF/model/User.java'
                exclude 'stirling/software/SPDF/repository/**'
            }
        }
    }
}

openApi {
    apiDocsUrl = "http://localhost:8080/v1/api-docs"
    outputDir = file("$projectDir")
    outputFileName = "SwaggerDoc.json"
}

launch4j {
  icon = "${projectDir}/src/main/resources/static/favicon.ico"

  outfile="Stirling-PDF.exe"
  headerType="console"
  jarTask = tasks.bootJar

  errTitle="Encountered error, Do you have Java 21?"
  downloadUrl="https://download.oracle.com/java/21/latest/jdk-21_windows-x64_bin.exe"
  variables=["BROWSER_OPEN=true", "ENDPOINTS_GROUPS_TO_REMOVE=CLI"]
  jreMinVersion="17"

  mutexName="Stirling-PDF"
  windowTitle="Stirling-PDF"

  messagesStartupError="An error occurred while starting Stirling-PDF"
  //messagesJreNotFoundError="This application requires a Java Runtime Environment, Please download Java 17."
  messagesJreVersionError="You are running the wrong version of Java, Please download Java 21."
  messagesLauncherError="Java is corrupted. Please uninstall and then install  Java 21."
  messagesInstanceAlreadyExists="Stirling-PDF is already running."
}

spotless {
    java {
        target project.fileTree('src/main/java')

        googleJavaFormat('1.19.1').aosp().reorderImports(false)

        importOrder('java', 'javax', 'org', 'com', 'net', 'io')
        toggleOffOn()
        trimTrailingWhitespace()
        indentWithSpaces()
        endWithNewline()
    }
}

dependencies {
    //security updates
    implementation 'ch.qos.logback:logback-classic:1.5.3'
    implementation 'ch.qos.logback:logback-core:1.5.3'
    implementation 'org.springframework:spring-webmvc:6.1.5'

    implementation("io.github.pixee:java-security-toolkit:1.1.3")

    implementation 'org.yaml:snakeyaml:2.2'
    
    // Exclude Tomcat and include Jetty
    implementation('org.springframework.boot:spring-boot-starter-web:3.2.4') {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
    }
    implementation 'org.springframework.boot:spring-boot-starter-jetty:3.2.4'
    
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.4'

    if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') {
        implementation 'org.springframework.boot:spring-boot-starter-security:3.2.4'
        implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE'
        implementation "org.springframework.boot:spring-boot-starter-data-jpa:3.2.4"
        implementation 'org.springframework.boot:spring-boot-starter-oauth2-client:3.2.4'

        //2.2.x requires rebuild of DB file.. need migration path
        implementation "com.h2database:h2:2.1.214"
    }

    testImplementation 'org.springframework.boot:spring-boot-starter-test:3.2.4'

    // Batik
    implementation 'org.apache.xmlgraphics:batik-all:1.17'

    // TwelveMonkeys
    implementation 'com.twelvemonkeys.imageio:imageio-batik:3.10.1'
    implementation 'com.twelvemonkeys.imageio:imageio-bmp:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-hdr:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-icns:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-iff:3.10.1'
    implementation 'com.twelvemonkeys.imageio:imageio-jpeg:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-pcx:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-pict:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-pnm:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-psd:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-sgi:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-tga:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-thumbsdb:3.10.1'
    implementation 'com.twelvemonkeys.imageio:imageio-tiff:3.10.1'
    implementation 'com.twelvemonkeys.imageio:imageio-webp:3.10.1'
    // implementation 'com.twelvemonkeys.imageio:imageio-xwd:3.10.1'

    implementation 'commons-io:commons-io:2.15.1'
    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'

    //general PDF

    // https://mvnrepository.com/artifact/com.opencsv/opencsv
    implementation ('com.opencsv:opencsv:5.9') {
        exclude group: 'commons-logging', module: 'commons-logging'
    }

    implementation ('org.apache.pdfbox:pdfbox:3.0.2'){
        exclude group: 'commons-logging', module: 'commons-logging'
    }

    implementation ('org.apache.pdfbox:xmpbox:3.0.2'){
        exclude group: 'commons-logging', module: 'commons-logging'
    }

    implementation 'org.bouncycastle:bcprov-jdk18on:1.77'
    implementation 'org.bouncycastle:bcpkix-jdk18on:1.77'
    implementation 'org.springframework.boot:spring-boot-starter-actuator:3.2.4'
    implementation 'io.micrometer:micrometer-core:1.12.4'
    implementation group: 'com.google.zxing', name: 'core', version: '3.5.3'
    // https://mvnrepository.com/artifact/org.commonmark/commonmark
    implementation 'org.commonmark:commonmark:0.22.0'
    implementation 'org.commonmark:commonmark-ext-gfm-tables:0.22.0'
    // https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core
    implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0'

	implementation 'com.fathzer:javaluator:3.0.3'

    developmentOnly("org.springframework.boot:spring-boot-devtools:3.2.4")
    compileOnly 'org.projectlombok:lombok:1.18.32'
    annotationProcessor 'org.projectlombok:lombok:1.18.32'
}

tasks.withType(JavaCompile) {
    dependsOn 'spotlessApply'
}
compileJava {
    options.compilerArgs << '-parameters'
}

task writeVersion {
    def propsFile = file('src/main/resources/version.properties')
    def props = new Properties()
    props.setProperty('version', version)
    props.store(propsFile.newWriter(), null)
}

swaggerhubUpload {
    //dependsOn generateOpenApiDocs  // Depends on your task generating Swagger docs
    api 'Stirling-PDF'  // The name of your API on SwaggerHub
    owner 'Frooodle'  // Your SwaggerHub username (or organization name)
    version project.version  // The version of your API
    inputFile './SwaggerDoc.json'  // The path to your Swagger docs
    token  "${System.getenv('SWAGGERHUB_API_KEY')}"  // Your SwaggerHub API key, passed as an environment variable
    oas '3.0.0'  // The version of the OpenAPI Specification you're using
}



jar {
    enabled = false
    manifest {
        attributes 'Implementation-Title': 'Stirling-PDF',
                   'Implementation-Version': project.version
    }

}

tasks.named('test') {
    useJUnitPlatform()
}

task printVersion {
  println project.version
}