package io.zonky.test.util;

import io.zonky.test.db.flyway.FlywayClassUtils;
import org.flywaydb.core.Flyway;
import org.springframework.util.CollectionUtils;

import javax.sql.DataSource;
import java.util.List;

import static io.zonky.test.db.util.ReflectionUtils.invokeMethod;
import static io.zonky.test.db.util.ReflectionUtils.invokeStaticMethod;
import static java.util.Collections.emptyList;

public class FlywayTestUtils {

    private FlywayTestUtils() {}

    public static Flyway createFlyway(DataSource dataSource, String schema) {
        return createFlyway(dataSource, schema, emptyList());
    }

    public static Flyway createFlyway(DataSource dataSource, String schema, List<String> locations) {
        return createFlyway(dataSource, schema, locations, true);
    }

    public static Flyway createFlyway(DataSource dataSource, String schema, List<String> locations, boolean validateOnMigrate) {
        int flywayVersion = FlywayClassUtils.getFlywayVersion();

        if (flywayVersion >= 60) {
            Object config = invokeStaticMethod(Flyway.class, "configure");
            invokeMethod(config, "dataSource", dataSource);
            invokeMethod(config, "schemas", (Object) new String[]{ schema });
            invokeMethod(config, "validateOnMigrate", validateOnMigrate);
            if (!CollectionUtils.isEmpty(locations)) {
                invokeMethod(config, "locations", (Object) locations.toArray(new String[0]));
            }
            return (Flyway) invokeMethod(config, "load");
        } else {
            Flyway flyway = new Flyway();
            flyway.setDataSource(dataSource);
            flyway.setSchemas(schema);
            flyway.setValidateOnMigrate(validateOnMigrate);
            if (!CollectionUtils.isEmpty(locations)) {
                flyway.setLocations(locations.toArray(new String[0]));
            }
            return flyway;
        }
    }
}