# ==============================================================
# user-service Nacos配置示例
# 完整配置，复制到 src/main/resources/application.yml
# ==============================================================

server:
  port: ${SERVER_PORT:8082}
  servlet:
    context-path: /user
  tomcat:
    threads:
      max: 200
      min-spare: 10
    max-connections: 10000
    accept-count: 100

spring:
  application:
    name: user-service
  
  # 数据源配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3307}/erp_java?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    username: ${MYSQL_USER:erp_user}
    password: ${MYSQL_PASSWORD:erp123456}
    hikari:
      connection-timeout: 30000
      maximum-pool-size: 20
      minimum-idle: 5
      idle-timeout: 600000
      max-lifetime: 1800000
      connection-test-query: SELECT 1
      pool-name: UserServiceHikariPool
  
  # Redis配置
  redis:
    host: ${REDIS_HOST:localhost}
    port: ${REDIS_PORT:6379}
    password: ${REDIS_PASSWORD:redis123456}
    database: 0
    timeout: 3000ms
    lettuce:
      pool:
        max-active: 20
        max-idle: 10
        min-idle: 5
  
  # MyBatis配置
  mybatis-plus:
    configuration:
      map-underscore-to-camel-case: true
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    global-config:
      db-config:
        logic-delete-field: deletedAt
        logic-delete-value: NOW()
        logic-not-delete-value: NULL

  # ==============================================================
  # Spring Cloud Alibaba Nacos 配置（核心部分）
  # ==============================================================
  cloud:
    nacos:
      # ---------- 服务发现与注册 ----------
      discovery:
        # Nacos服务器地址（集群模式用VIP）
        server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
        # 命名空间（环境隔离）
        namespace: ${NACOS_NAMESPACE:public}
        # 分组（业务隔离）
        group: ${NACOS_GROUP:DEFAULT_GROUP}
        # 实例ID格式：${ip}#${port}#${cluster}#${serviceName}#${namespace}
        instance-id: ${spring.cloud.nacos.discovery.ip}#${server.port}#DEFAULT#${spring.application.name}#${spring.cloud.nacos.discovery.namespace}
        # 是否优先使用IP注册
        prefer-ip-address: true
        # IP地址（容器环境自动检测，VM环境可手动指定）
        # ip: ${SERVICE_IP:127.0.0.1}
        # 端口（通常不用指定，会自动检测）
        # port: ${SERVER_PORT:8082}
        # 集群名称
        cluster-name: DEFAULT
        # 权重（负载均衡用）
        weight: 1.0
        # 实例数量（单机=1）
        instance-count: 1
        # 是否开启实例预热（防止流量瞬间涌入）
        instance-enabled-preheat: true
        
        # ---------- 心跳配置 ----------
        # 心跳间隔（默认5秒）
        heart-beat-interval: 5000
        # 心跳超时时间（默认15秒）
        heart-beat-timeout: 15000
        # 实例删除超时（默认30秒）
        ip-delete-timeout: 30
        # 是否开启优雅下线
        enabled-healthy-rule: true
        
        # ---------- 实例元数据 ----------
        metadata:
          version: ${SERVICE_VERSION:1.0.0}
          environment: ${SPRING_PROFILES_ACTIVE:dev}
          description: 用户服务 - 用户管理、认证、权限
          owner: erp-team
          protocol: http
          tags: auth,user,permission
        
        # ---------- 订阅 ----------
        # 是否订阅服务变化（服务发现）
        subscribe: true
      
      # ---------- 配置中心 ----------
      config:
        enabled: true
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        namespace: ${NACOS_NAMESPACE:public}
        group: ${NACOS_GROUP:DEFAULT_GROUP}
        file-extension: yaml
        # 刷新机制
        refresh-enabled: true
        # 共享配置
        shared-configs:
          - data-id: common-config.yaml
            group: DEFAULT_GROUP
            refresh: true
          - data-id: redis-config.yaml
            group: DEFAULT_GROUP
            refresh: true
        # 扩展配置
        extension-configs:
          - data-id: ${spring.application.name}-${spring.profiles.active}.yaml
            group: ${NACOS_GROUP:DEFAULT_GROUP}
            refresh: true
      
      # ---------- 认证信息 ----------
      username: ${NACOS_USERNAME:nacos}
      password: ${NACOS_PASSWORD:nacos123456}

  # profiles环境
  profiles:
    active: ${SPRING_PROFILES_ACTIVE:dev}

# ==============================================================
# Actuator健康检查配置
# ==============================================================
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,env,prometheus
      base-path: /actuator
  endpoint:
    health:
      show-details: always
      probes:
        enabled: true
      path: /actuator/health
    info:
      enabled: true
  health:
    nacos:
      enabled: true
    redis:
      enabled: true
    db:
      enabled: true
  metrics:
    export:
      prometheus:
        enabled: true
    tags:
      application: ${spring.application.name}

# ==============================================================
# 日志配置
# ==============================================================
logging:
  level:
    com.erp.user: ${LOG_LEVEL_USER:DEBUG}
    org.springframework.cloud.alibaba.nacos: ${LOG_LEVEL_NACOS:INFO}
    com.alibaba.nacos: ${LOG_LEVEL_NACOS_CLIENT:INFO}
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n"

# ==============================================================
# JWT配置
# ==============================================================
jwt:
  secret: ${JWT_SECRET:erp-java-backend-secret-key-for-jwt-signing-must-be-at-least-256-bits-long-2026}
  access-token-expiration: 900
  refresh-token-expiration: 604800
  remember-me-expiration: 2592000

# ==============================================================
# 安全配置
# ==============================================================
security:
  max-login-attempts: 5
  lock-duration-minutes: 30
  attempt-expire-minutes: 60
  max-reset-attempts: 3
  reset-attempt-expire-minutes: 60
  reset-token-expiry-minutes: 30
  password-history-size: 5

# ==============================================================
# 服务配置
# ==============================================================
service:
  auth:
    enabled: true
  rate-limit:
    enabled: true
    capacity: 100
    refill-rate: 10
