"""Backup dan restore database Pencatat Keuangan Pribadi."""

import sqlite3
from contextlib import closing
from pathlib import Path

import db


def buat_backup(path_sumber, path_tujuan):
    """Salin database secara konsisten dengan backup API, lalu verifikasi hasil."""
    with closing(db.get_connection(path_sumber)) as sumber:
        with closing(sqlite3.connect(path_tujuan)) as tujuan:
            sumber.backup(tujuan)
    if not verifikasi_integritas(path_tujuan):
        raise sqlite3.DatabaseError(f"Integritas {path_tujuan} tidak lolos uji.")
    return path_tujuan


def restore_backup(path_backup, path_tujuan):
    """Pulihkan database dari berkas backup, lalu verifikasi hasilnya."""
    with closing(db.get_connection(path_backup)) as sumber:
        with closing(sqlite3.connect(path_tujuan)) as tujuan:
            sumber.backup(tujuan)
    if not verifikasi_integritas(path_tujuan):
        raise sqlite3.DatabaseError(f"Integritas {path_tujuan} tidak lolos uji.")
    return path_tujuan


def verifikasi_integritas(path):
    """Jalankan PRAGMA integrity_check pada satu berkas database."""
    with closing(db.get_connection(path)) as con:
        hasil = con.execute("PRAGMA integrity_check").fetchone()
        return hasil[0] == "ok"


def main():
    while True:
        print("=== Backup dan Restore ===")
        print("1. Buat backup")
        print("2. Restore dari backup")
        print("3. Keluar")
        pilihan = input("Pilihan: ").strip()

        if pilihan == "1":
            if not Path(db.NAMA_DB).exists():
                print(f"Berkas {db.NAMA_DB} belum ada — jalankan main.py dulu.")
                continue
            tujuan = input("Nama berkas backup: ").strip()
            if not tujuan:
                print("Nama berkas tidak boleh kosong.")
                continue
            try:
                buat_backup(db.NAMA_DB, tujuan)
            except sqlite3.DatabaseError as e:
                print(f"Backup gagal: {e}")
                continue
            print(f"Backup {db.NAMA_DB} tersimpan ke {tujuan}.")
            print("Verifikasi integritas: ok")
        elif pilihan == "2":
            sumber = input("Nama berkas backup: ").strip()
            if not sumber:
                print("Nama berkas tidak boleh kosong.")
                continue
            if not Path(sumber).exists():
                print(f"Berkas {sumber} tidak ditemukan.")
                continue
            try:
                restore_backup(sumber, db.NAMA_DB)
            except sqlite3.DatabaseError as e:
                print(f"Restore gagal: {e}")
                continue
            print(f"Database {db.NAMA_DB} dipulihkan dari {sumber}.")
            print("Verifikasi integritas: ok")
        elif pilihan == "3":
            print("Sampai jumpa!")
            break
        else:
            print("Pilihan tidak dikenal.")


if __name__ == "__main__":
    main()
