package sample.context.orm;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.boot.jdbc.DatabaseDriver;
import org.springframework.util.StringUtils;

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

import lombok.Data;

/**
 * DataSource生成用の設定クラス。
 * <p>継承先で@ConfigurationProperties定義を行ってapplication.ymlと紐付してください。
 * <p>ベース実装にHikariCPを利用しています。必要に応じて設定可能フィールドを増やすようにしてください。
 */
@Data
public class OrmDataSourceProperties {

    /** ドライバクラス名称 ( 未設定時は url から自動登録 ) */
    private String driverClassName;
    private String url;
    private String username;
    private String password;
    private Properties props = new Properties();

    /** 最低接続プーリング数 */
    private int minIdle = 1;
    /** 最大接続プーリング数 */
    private int maxPoolSize = 20;
    
    /** コネクション状態を確認する時は true */
    private boolean validation = true;
    /** コネクション状態確認クエリ ( 未設定時かつ Database が対応している時は自動設定 ) */
    private String validationQuery;

    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setDriverClassName(driverClassName());
        config.setJdbcUrl(url);
        config.setUsername(username);
        config.setPassword(password);
        config.setMinimumIdle(minIdle);
        config.setMaximumPoolSize(maxPoolSize);
        if (validation) {
            config.setConnectionTestQuery(validationQuery());
        }
        config.setDataSourceProperties(props);
        return new HikariDataSource(config);
    }

    private String driverClassName() {
        if (StringUtils.hasText(driverClassName)) {
            return driverClassName;
        }
        return DatabaseDriver.fromJdbcUrl(url).getDriverClassName();
    }
    
    private String validationQuery() {
        if (StringUtils.hasText(validationQuery)) {
            return validationQuery;
        }
        return DatabaseDriver.fromJdbcUrl(url).getValidationQuery();
    }

}