import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UrlJdbc {

    public static void main(String[] args) {
        String[] daftarUrl = {
                "jdbc:sqlite:/data/toko.db",
                "jdbc:postgresql://localhost:5432/toko?sslmode=require",
                "jdbc:mysql://127.0.0.1:3306/toko?useSSL=false&serverTimezone=UTC",
                "jdbc:demo:toko",
                "http://localhost:5432/toko"
        };
        for (String url : daftarUrl) {
            bedah(url);
            System.out.println();
        }
    }

    static void bedah(String url) {
        System.out.println("URL         : " + url);
        if (!url.startsWith("jdbc:")) {
            System.out.println("status      : DITOLAK, skema wajib diawali \"jdbc:\"");
            return;
        }
        int titikDua = url.indexOf(':', 5);
        if (titikDua < 0) {
            System.out.println("status      : DITOLAK, subprotokol tidak ditemukan");
            return;
        }
        String subprotokol = url.substring(5, titikDua);
        String sisa = url.substring(titikDua + 1);
        System.out.println("subprotokol : " + subprotokol);

        if (sisa.startsWith("//")) {
            // bentuk jaringan: //host:port/database?param=nilai&...
            Matcher m = Pattern
                    .compile("^//([^/:?]+)(?::(\\d+))?/([^?]+)(?:\\?(.*))?$")
                    .matcher(sisa);
            if (m.matches()) {
                System.out.println("host        : " + m.group(1));
                System.out.println("port        : "
                        + (m.group(2) == null ? "default" : m.group(2)));
                System.out.println("database    : " + m.group(3));
                if (m.group(4) != null && !m.group(4).isBlank()) {
                    System.out.println("parameter   : " + m.group(4));
                }
            } else {
                System.out.println("status      : format //host:port/database tidak cocok");
                return;
            }
        } else {
            // bentuk berkas (SQLite): path relatif atau absolut
            System.out.println("berkas      : " + sisa);
        }
        System.out.println("driver      : " + namaDriver(subprotokol));
    }

    static String namaDriver(String subprotokol) {
        return switch (subprotokol) {
            case "sqlite" -> "org.sqlite.JDBC (jar: org.xerial:sqlite-jdbc)";
            case "postgresql" -> "org.postgresql.Driver (jar: org.postgresql:postgresql)";
            case "mysql" -> "com.mysql.cj.jdbc.Driver (jar: com.mysql:mysql-connector-j)";
            default -> "TIDAK DIKENAL: tidak ada driver untuk subprotokol ini";
        };
    }
}
