package com.erp.tenant;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

/**
 * HikariDataSource 빌더.
 *
 * - META 용: 앱 상시 접근. 기존 application.yml 의 설정값과 호환 (minIdle=2, max=10).
 * - Tenant 용: 회사 수만큼 풀이 복제되므로 ★ minIdle=0 ★ + idleTimeout=1분.
 *   → 안 쓰는 회사 풀은 커넥션 0으로 수축, Postgres max_connections 압박 방지.
 *   (실행계획 문서 2.1 참조)
 */
public final class TenantDataSourceFactory {

    private TenantDataSourceFactory() {}

    public static HikariDataSource createMeta(String jdbcUrl, String username, String password) {
        HikariConfig cfg = base(jdbcUrl, username, password);
        cfg.setPoolName("meta-hikari");
        cfg.setMaximumPoolSize(10);
        cfg.setMinimumIdle(2);
        cfg.setIdleTimeout(600_000);
        return new HikariDataSource(cfg);
    }

    public static HikariDataSource createTenant(String jdbcUrl, String username, String password, String dbName) {
        HikariConfig cfg = base(jdbcUrl, username, password);
        cfg.setPoolName("tenant-" + dbName);
        cfg.setMaximumPoolSize(5);
        cfg.setMinimumIdle(0);          // ★ 회사 풀 폭증 방지의 핵심
        cfg.setIdleTimeout(60_000);     // 1분 idle → 반납
        return new HikariDataSource(cfg);
    }

    private static HikariConfig base(String jdbcUrl, String username, String password) {
        HikariConfig cfg = new HikariConfig();
        cfg.setJdbcUrl(jdbcUrl);
        cfg.setUsername(username);
        cfg.setPassword(password);
        cfg.setDriverClassName("org.postgresql.Driver");
        cfg.setConnectionTimeout(30_000);
        cfg.setMaxLifetime(1_800_000);
        return cfg;
    }
}
