# 킨텍스 AI 전시관리 시스템 — 백엔드 설정
# 모든 시크릿·엔드포인트는 환경변수 플레이스홀더로만 주입한다(하드코딩 금지).
#   - DB_URL / DB_USER / DB_PASSWORD : PostgreSQL(PostGIS) 접속
#   - REDIS_HOST / REDIS_PORT        : Redis 작업 큐
#   - JWT_SECRET                     : JWT 서명 키(HS256, 최소 32바이트)
#   - KINTEX_OTP_ENC_KEY             : OTP 시크릿 AES-256-GCM 키(base64 32바이트) — 운영 주입 필수
#   - OTP_ENFORCE                    : 필수 역할 OTP 등록 강제(기본 true; 데모 완화 시 false)
#   - ADMIN_SEED_ENABLED/ADMIN_EMAIL/ADMIN_PASSWORD : 최초 관리자 프로비저닝(하드코딩 시드 금지)
#   - GEMINI_API_KEY                 : 나노바나나 Python 워커 전용(백엔드는 큐 발행만; 여기서 미사용)
server:
  port: ${SERVER_PORT:8080}
  error:
    include-stacktrace: never       # 스택트레이스 미노출(보안 불변)
    include-message: never
    include-binding-errors: never

spring:
  application:
    name: kintex-backend
  servlet:
    multipart:
      max-file-size: 8MB       # 로그인 슬라이드 등 이미지 업로드 상한
      max-request-size: 10MB
  datasource:
    url: ${DB_URL:jdbc:postgresql://localhost:5432/kintex_db}
    username: ${DB_USER:kintex}
    password: ${DB_PASSWORD:}
    driver-class-name: org.postgresql.Driver
    hikari:
      maximum-pool-size: ${DB_POOL_MAX:3}   # GUARDiA 표준(공유 PG 보호)
      pool-name: kintex-hikari
  data:
    redis:
      host: ${REDIS_HOST:localhost}
      port: ${REDIS_PORT:6379}
      password: ${REDIS_PASSWORD:}
  # 메일(자체 Postfix SMTP — mail.zioinfo.co.kr, GUARDiA 운영). 자격증명은 env 주입만(하드코딩 금지).
  #   실 발송은 MAIL_ENABLED=true 일 때만. 미주입 시 인앱/스킵 로그만 남긴다(정직 로그).
  mail:
    host: ${SMTP_HOST:mail.zioinfo.co.kr}
    port: ${SMTP_PORT:587}
    username: ${SMTP_USER:}
    password: ${SMTP_PASSWORD:}
    properties:
      mail.smtp.auth: ${SMTP_AUTH:true}
      mail.smtp.starttls.enable: ${SMTP_STARTTLS:true}
      mail.smtp.connectiontimeout: 8000
      mail.smtp.timeout: 8000
      mail.smtp.writetimeout: 8000
  # Flyway — 순번 DDL/시드가 스키마의 권위(sql.init 미사용, 후행 테이블 미적용 함정 회피).
  flyway:
    enabled: ${FLYWAY_ENABLED:true}
    locations: classpath:db/migration
    baseline-on-migrate: true         # 기존 DB에도 안전 적용(파괴적 변경 금지)

# MyBatis — 공간 SQL 매퍼 XML은 kintex-db-engineer가 채운다(D-2/M2-1/M4-1).
mybatis:
  mapper-locations: classpath*:mybatis/mapper/**/*.xml
  configuration:
    map-underscore-to-camel-case: true
    jdbc-type-for-null: NULL

# 애플리케이션 커스텀 설정
kintex:
  auth:
    jwt-secret: ${JWT_SECRET:CHANGE_ME_DEV_ONLY_kintex_local_secret_key_min_32_bytes}
    access-token-ttl-seconds: ${JWT_ACCESS_TTL:3600}
  # 2차 인증(OTP)·로그인 실패 잠금·admin 시드 — 시크릿/비번은 env 주입만(하드코딩·admin123 시드 금지, 계약 §5B-3).
  security:
    lockout:
      max-failed-attempts: ${LOGIN_MAX_FAILED:5}
      lock-minutes: ${LOGIN_LOCK_MINUTES:15}
    otp:
      issuer: ${OTP_ISSUER:KINTEX}
      # OTP 시크릿 AES-256-GCM 암호화 키(base64 32바이트). 운영은 env 주입 필수, 미주입 시 개발 파생키.
      enc-key: ${KINTEX_OTP_ENC_KEY:}
      # 필수 역할(관람객 외) OTP 등록·검증 강제. 데모 편의 시 OTP_ENFORCE=false 로 완화.
      enforce: ${OTP_ENFORCE:true}
    # 최초 관리자 프로비저닝 — 값이 모두 주입될 때만 멱등 upsert. 미주입 시 시드 안 함(기본 관리자 계정 없음).
    admin-seed:
      enabled: ${ADMIN_SEED_ENABLED:false}
      email: ${ADMIN_EMAIL:}
      password: ${ADMIN_PASSWORD:}
      display-name: ${ADMIN_DISPLAY_NAME:시스템관리자}
  # 메일 발송 채널(옥션 개설 통지·EDM·비밀번호 재설정). enabled=false면 인앱/스킵 로그만(실 전송 없음).
  mail:
    enabled: ${MAIL_ENABLED:false}
    from: ${MAIL_FROM:no-reply@kintex.zioinfo.co.kr}
    # 재설정 링크의 프론트 베이스 URL — 링크는 코드 안내용(프론트 reset 흐름은 이메일+코드 입력).
    web-base-url: ${WEB_BASE_URL:https://kintex.zioinfo.co.kr}
  rules:
    # 버전 관리되는 룰셋 데이터(규정·요율) — 코드가 아닌 데이터로 유지(킨텍스 규정 개정 대응)
    compliance-ruleset: classpath:rulesets/compliance-v1.json
    rate-ruleset: classpath:rulesets/rates-v1.json
  # B11 CORS — 허용 오리진 화이트리스트(콤마구분, env 주입). 와일드카드('*') 금지(코드에서 필터링).
  #   운영은 CORS_ALLOWED_ORIGINS 로 운영 도메인만 명시 주입한다. 기본값은 로컬 개발 오리진.
  cors:
    allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:5173,http://localhost:3000}
  upload:
    # 관리자 업로드 파일 저장 루트(로그인 슬라이드 이미지·프로필 아바타 등) — 아바타는 인증 서빙(정적 아님)
    dir: ${UPLOAD_DIR:./data/uploads}
  render:
    # RenderJob Redis 큐 이름(나노바나나 워커가 소비) — visualizer와 합의한 계약
    queue-key: ${RENDER_QUEUE_KEY:kintex:renderjob:queue}
    event-quota-default: ${RENDER_EVENT_QUOTA:500}

logging:
  level:
    root: INFO
    com.zioinfo.kintex: DEBUG
