/**
 * XIT Framework Gradle 빌드 설정 파일
 * 
 * 주요 버전 정보:
 * - Spring Boot: 2.7.18 (스프링 부트 버전)
 * - Java: 1.8 (소스 및 타겟 호환성)
 * - 전자정부 프레임워크: 4.3.0
 */

plugins {
    // 스프링 부트 플러그인 - 스프링 부트 애플리케이션 빌드 및 실행을 지원
    id 'org.springframework.boot' version '2.7.18'
    // 스프링 의존성 관리 플러그인 - 스프링 부트 버전에 맞는 의존성 버전 관리
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    // 자바 플러그인 - 자바 소스 컴파일 지원
    id 'java'
    // WAR 플러그인 - 웹 애플리케이션 아카이브 생성 지원
    id 'war'
}

// 프로젝트 그룹 및 버전 정보
group = 'go.kr.project'
version = '0.0.1-SNAPSHOT'

// 자바 버전 설정 (소스 및 타겟 호환성)
java {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

// Java 컴파일 옵션 설정
//tasks.withType(JavaCompile) {
//    options.encoding = 'UTF-8'
//    options.compilerArgs += [
//        '-Xlint:deprecation',
//        '-Xlint:unchecked'
//    ]
//}

// 설정 구성
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

// 저장소 설정
repositories {
    mavenCentral() // 메이븐 중앙 저장소
    maven { url 'https://maven.egovframe.go.kr/maven/' } // 전자정부 프레임워크 저장소
}

// 버전 변수 정의
ext {
    // 서버 관련 버전
    tomcatVersion = '9.0.78' // 톰캣 9 버전 (Servlet 3.1 지원)

    // 라이브러리 버전
    tilesVersion = '3.0.8' // 타일즈 버전
    mybatisVersion = '2.3.1' // 마이바티스 스프링 부트 스타터 버전
    commonsTextVersion = '1.10.0' // 아파치 커먼스 텍스트 버전
    egovFrameVersion = '4.3.0' // 전자정부 프레임워크 버전
}

dependencies {
    // ===== 스프링 부트 핵심 의존성 =====
    // 스프링 부트 웹 스타터 - MVC, REST, 내장 톰캣 등 웹 개발에 필요한 기본 의존성 포함
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // 스프링 부트 유효성 검사 스타터 - Bean Validation API 구현체 포함
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    // 스프링 부트 AOP 스타터 - 관점 지향 프로그래밍 지원
    implementation 'org.springframework.boot:spring-boot-starter-aop'
    // 스프링 부트 JDBC 스타터 - JDBC 및 커넥션 풀(HikariCP) 포함
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    //implementation 'org.springframework.boot:spring-boot-starter-data-jpa' /* 실제 사용 X, intellij plugin 사용을 위해 설정 */

    // ===== 전자정부 프레임워크 의존성 =====
    // 전자정부 프레임워크 공통 기능 - 공통 유틸리티 및 예외 처리 등
    implementation("org.egovframe.rte:org.egovframe.rte.fdl.cmmn:${egovFrameVersion}") {
        exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl' /* 보안이슈 대응 후 쿼리로그 문제 발생, SLF4J 충돌 발생  */
    }
    // 전자정부 프레임워크 MVC - 웹 MVC 관련 기능
    implementation("org.egovframe.rte:org.egovframe.rte.ptl.mvc:${egovFrameVersion}") {
        exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j-impl' /* 보안이슈 대응 후 쿼리로그 문제 발생, SLF4J 충돌 발생  */
    }


    // ===== 로깅 의존성 =====
    // Logback - 로깅 구현체
    implementation 'ch.qos.logback:logback-classic'
    implementation 'ch.qos.logback:logback-core'
    // SLF4J - 로깅 퍼사드 인터페이스
    implementation 'org.slf4j:slf4j-api'

    // ===== 서블릿 & JSP 관련 의존성 =====
    // JSTL - JSP 표준 태그 라이브러리
    implementation 'javax.servlet:jstl'

    // ===== 톰캣 설정 =====
    // 톰캣 9 명시적 설정 (Servlet 3.1 지원)
    implementation "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}"
    implementation "org.apache.tomcat.embed:tomcat-embed-el:${tomcatVersion}"
    implementation "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}"

    // ===== 타일즈 의존성 =====
    // 타일즈 - 레이아웃 템플릿 엔진 (JSP 페이지 조각 조합)
    implementation "org.apache.tiles:tiles-jsp:${tilesVersion}"
    implementation "org.apache.tiles:tiles-core:${tilesVersion}"
    implementation "org.apache.tiles:tiles-api:${tilesVersion}"
    implementation "org.apache.tiles:tiles-servlet:${tilesVersion}"
    implementation "org.apache.tiles:tiles-el:${tilesVersion}"

    // ===== 데이터 액세스 의존성 =====
    // MyBatis 스프링 부트 스타터 - SQL 매핑 프레임워크
    implementation "org.mybatis.spring.boot:mybatis-spring-boot-starter:${mybatisVersion}"
    // MariaDB JDBC 드라이버 - MariaDB 데이터베이스 연결
    implementation 'org.mariadb.jdbc:mariadb-java-client'
    // HikariCP - 고성능 JDBC 커넥션 풀 (spring-boot-starter-jdbc에 포함됨)

    // ===== 유틸리티 의존성 =====
    // Apache Commons Text - 텍스트 처리 유틸리티
    implementation "org.apache.commons:commons-text:${commonsTextVersion}"
    // Apache HttpClient 4 - RestTemplate 연결 풀 관리
    implementation 'org.apache.httpcomponents:httpclient'
    // Guava - Rate Limiting 기능을 위한 RateLimiter
    implementation 'com.google.guava:guava:32.1.3-jre'

    // ===== EXCEL =====
    implementation 'org.apache.poi:poi:5.3.0'
    implementation 'org.apache.poi:poi-ooxml:5.3.0'

    // ===== Swagger UI =====
    implementation 'org.springdoc:springdoc-openapi-ui:1.7.0'
    implementation 'org.springdoc:springdoc-openapi-webmvc-core:1.7.0'

    // ===== sqlPaser =====
    implementation 'com.github.jsqlparser:jsqlparser:4.5'

    // ===== datasource-proxy =====
    // 파라미터 바인딩된 SQL 쿼리 로깅을 위한 datasource-proxy
    implementation 'net.ttddyy:datasource-proxy:1.10.1'

    // ===== VMIS 통합 관련 의존성 =====
    // GPKI 암호화 라이브러리 (정부 API 연동)
    implementation files('lib/libgpkiapi_jni_1.5.jar')

    // ===== 개발 도구 의존성 =====
    // Lombok - 반복 코드 생성 도구 (Getter, Setter, Builder 등 자동 생성)
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    // 스프링 부트 개발 도구 - 자동 재시작, 라이브 리로드 등
    developmentOnly 'org.springframework.boot:spring-boot-devtools'

    // ===== 테스트 의존성 =====
    // 스프링 부트 테스트 스타터 - JUnit, Mockito 등 테스트 도구 포함
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    // ===== 배포 관련 의존성 =====
    // 톰캣 서블릿 API - 외부 톰캣 배포 시 사용
    providedCompile "org.apache.tomcat:tomcat-servlet-api:${tomcatVersion}"
    // 스프링 부트 톰캣 - 외부 톰캣 배포 시 내장 톰캣 제외
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

// ===== 리소스 필터링 설정 =====
// application*.yml 파일에서 @변수명@ 플레이스홀더를 gradle.properties의 값으로 치환
processResources {
    // application*.yml 파일에서만 @projectName@ 치환
    filesMatching('application*.yml') {
        filter { line ->
            line.replaceAll('@projectName@', project.property('projectName').toString())
        }
    }
}

// ===== 테스트 설정 =====
// JUnit 플랫폼을 사용하여 테스트 실행 (JUnit 5 지원)
tasks.named('test') {
    useJUnitPlatform()
}

// ===== WAR 파일 설정 =====
// 생성될 WAR 파일의 이름 지정 (gradle.properties의 프로젝트명 전역변수 사용)
war {
    archiveFileName = "${projectName}.war"
}

// ===== bootWar 파일 설정 =====
// 생성될 bootWar 파일의 이름 지정 (gradle.properties의 프로젝트명 전역변수 사용)
bootWar {
    archiveFileName = "${projectName}-BOOT.war"
}

// war 포함 압축 푼 소스 포함,
// ./build/exploded/{프로젝트명}/
tasks.register('exploded', Copy) {
    dependsOn 'war'
    from zipTree(tasks.war.archiveFile)
    into layout.buildDirectory.dir("exploded/${project.name}")
    doFirst {
        layout.buildDirectory.dir("exploded/${project.name}").get().asFile.deleteDir()
    }
}
