#!/usr/bin/env python3
# Rollback satu langkah: jalankan berkas .down.sql milik versi terakhir
# yang terpasang, lalu hapus catatannya dari schema_migrations.
import os

import psycopg

BASE = os.path.dirname(os.path.abspath(__file__))

conn = psycopg.connect()
baris = conn.execute(
    "SELECT version, name FROM schema_migrations "
    "ORDER BY version DESC LIMIT 1"
).fetchone()
# Tutup transaksi pembacaan agar blok rollback menjadi transaksi teratas.
conn.commit()

if baris is None:
    print("tidak ada migrasi untuk di-rollback")
else:
    versi, nama = baris
    berkas = os.path.join(BASE, f"{versi:04d}_{nama}.down.sql")
    sql = open(berkas).read()
    # Transaksi yang sama mencakup DDL dan penghapusan catatan versi,
    # sehingga skema dan tabel pelacakan selalu sejalan.
    with conn.transaction():
        conn.execute(sql)
        conn.execute(
            "DELETE FROM schema_migrations WHERE version = %s", (versi,))
    print(f"rollback {versi:04d}_{nama}")
    print(f"menjalankan berkas {os.path.basename(berkas)}")

for versi, nama in conn.execute(
        "SELECT version, name FROM schema_migrations ORDER BY version").fetchall():
    print(f"terpasang: {versi:04d}_{nama}")

conn.close()
