package gc.mda.signal_batch.global.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * WebSocket 부하 제어 관련 설정
 * application-{profile}.yml의 websocket.* 설정을 바인딩
 */
@Data
@Component
@ConfigurationProperties(prefix = "websocket")
public class WebSocketProperties {

    private QueryProperties query = new QueryProperties();
    private TransportProperties transport = new TransportProperties();
    private BackpressureProperties backpressure = new BackpressureProperties();
    private SessionProperties session = new SessionProperties();

    @Data
    public static class QueryProperties {
        /** 서버 전체 동시 실행 쿼리 상한 */
        private int maxConcurrentGlobal = 60;
        /** 세션당 동시 쿼리 상한 */
        private int maxPerSession = 20;
        /** 글로벌 대기 큐 타임아웃 (초) */
        private int queueTimeoutSeconds = 30;
    }

    @Data
    public static class TransportProperties {
        private int inboundCorePoolSize = 10;
        private int inboundMaxPoolSize = 20;
        private int inboundQueueCapacity = 100;
        private int outboundCorePoolSize = 20;
        private int outboundMaxPoolSize = 40;
        private int outboundQueueCapacity = 200;
        private int messageSizeLimitMb = 2;
        private int sendBufferSizeLimitMb = 50;
        private int sendTimeLimitSeconds = 30;
    }

    @Data
    public static class BackpressureProperties {
        /** 최대 대기 버퍼 크기 (MB) */
        private long maxPendingBufferMb = 50;
        /** 메시지당 최대 크기 (KB) */
        private int maxMessageSizeKb = 1024;
        /** 메시지당 최소 크기 (KB) */
        private int minMessageSizeKb = 256;
    }

    @Data
    public static class SessionProperties {
        /** 세션 유휴 타임아웃 (밀리초) */
        private long idleTimeoutMs = 15000;
        /** 서버 하트비트 간격 (밀리초) */
        private long serverHeartbeatMs = 5000;
        /** 클라이언트 하트비트 간격 (밀리초) */
        private long clientHeartbeatMs = 5000;
        /** SockJS disconnect delay (밀리초) */
        private long sockjsDisconnectDelayMs = 5000;
        /** 메시지 전송 시간 제한 (초) */
        private int sendTimeLimitSeconds = 30;
    }
}
