package com.erp.tenant;

import java.net.URI;

/**
 * tenant DB 연결 공통 설정. 기존 {@code spring.datasource.url} 을 파싱해서
 * host/port/credential 을 회사별 pool 생성 시 재사용한다.
 * application.yml 에 별도 {@code tenant.*} prefix 를 추가하지 않는 이유:
 *   - 중복 저장 금지
 *   - 회사별 DB 는 기본적으로 같은 Postgres 인스턴스에 생성되므로 credential 1셋으로 충분
 *   - 다중 서버로 분산할 때는 COMPANY_MNG.DB_HOST 컬럼을 사용 (Phase 6)
 */
public record TenantDbSettings(String host, int port, String username, String password) {

    /**
     * jdbc:postgresql://host:port/dbname 에서 host/port 추출.
     * port 생략 시 5432 기본값.
     */
    public static TenantDbSettings fromJdbcUrl(String jdbcUrl, String username, String password) {
        if (jdbcUrl == null || !jdbcUrl.startsWith("jdbc:")) {
            throw new IllegalArgumentException("Unsupported jdbcUrl: " + jdbcUrl);
        }
        // "jdbc:postgresql://host:port/db?..." → URI 파싱 가능하게 "jdbc:" 제거
        URI uri = URI.create(jdbcUrl.substring("jdbc:".length()));
        String host = uri.getHost();
        int port = uri.getPort() == -1 ? 5432 : uri.getPort();
        if (host == null) {
            throw new IllegalArgumentException("Cannot parse host from jdbcUrl: " + jdbcUrl);
        }
        return new TenantDbSettings(host, port, username, password);
    }

    public String buildJdbcUrl(String dbName) {
        return String.format("jdbc:postgresql://%s:%d/%s", host, port, dbName);
    }
}
