package example;

import java.io.IOException;
import java.io.InputStream;
import javax.sql.DataSource;
import org.apache.ibatis.builder.xml.XMLMapperBuilder;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.postgresql.ds.PGSimpleDataSource;

public final class Factories {
    private Factories() {}
    public static DataSource dataSource() {
        PGSimpleDataSource dataSource = new PGSimpleDataSource();
        dataSource.setURL(required("LAB_DB_URL"));
        dataSource.setUser("lab_app");
        dataSource.setPassword(required("LAB_APP_PASSWORD"));
        dataSource.setConnectTimeout(3);
        dataSource.setSocketTimeout(5);
        dataSource.setApplicationName("mapper-lab");
        return dataSource;
    }
    public static SqlSessionFactory manual(TracePlugin trace) throws IOException {
        Configuration configuration = new Configuration(
                new Environment("lab", new JdbcTransactionFactory(), dataSource()));
        configuration.addInterceptor(trace);
        try (InputStream xml = Factories.class.getResourceAsStream("/example/OrderMapper.xml")) {
            if (xml == null) throw new IOException("OrderMapper.xml missing from classpath");
            new XMLMapperBuilder(xml, configuration, "example/OrderMapper.xml",
                    configuration.getSqlFragments()).parse();
        }
        return new SqlSessionFactoryBuilder().build(configuration);
    }
    private static String required(String name) {
        String value = System.getenv(name);
        if (value == null || value.isBlank()) throw new IllegalArgumentException("Missing " + name);
        return value;
    }
}
